酷代码 AI
菜单
服务商
DeepSeek字节豆包
更多选项

C++实现求数组最小值和次小值的两种思路及代码详解

根据题目描述,我们需要找到数组中的**最小值**和**次小值**。这里注意**次小值**是除去最小值后,剩余元素中最小的那个(如果最小值有重复,次小值应取下一个不同的值,还是下一个数值?需要看题目要求——通常是指**第二小的数字**,即所有数字按升序排列后的第二个数字)。 --- ## 🔍 解题思路 - 读取 n 和 n 个整数。 - 初始化 `min1`(最小值)和 `min2`(次小值)为很大的数(例如 `INT_MAX`)。 - 遍历数组: - 如果当前数字小于 `min1`,则先让 `min2 = min1`,再更新 `min1`。 - 否则如果当前数字**大于 `min1`** 且**小于 `min2`**,则更新 `min2`。 - 最后输出 `min1` 和 `min2`。 **注意**:如果所有数字都相同,则次小值不存在。但题目给出的样例和常规情况不会出现,这里假设输入保证存在两个不同的数字。 --- ## 🛠️ C++ 代码实现 ```cpp #include <iostream> #include <climits> using namespace std; int main() { int n; cin >> n; int min1 = INT_MAX, min2 = INT_MAX; int num; for (int i = 0; i < n; i++) { cin >> num; if (num < min1) { min2 = min1; // 原最小值变成次小值 min1 = num; // 更新最小值 } else if (num > min1 && num < min2) { min2 = num; // 更新次小值 } } cout << min1 << " " << min2 << endl; return 0; } ``` --- ## 📝 代码解释 - `min1`:记录最小值,`min2`:记录次小值,初始化为 `INT_MAX`(即整型最大值)。 - 遍历每个数字: - 如果比 `min1` 小,说明新的最小值出现,原 `min1` 变为次小值。 - 如果不比 `min1` 小,但比 `min2` 小且不等于 `min1`,则更新次小值。 - 输出结果。 --- ## 🧪 测试样例验证 **输入:** ``` 5 3 4 5 2 6 ``` **过程:** - min1=3, min2=MAX - 4 > min1, 但 4 < MAX → min2=4 - 5 > min1, 但 5 > min2 → 不更新 - 2 < min1 → min2=3, min1=2 - 6 > min1, 6 > min2 → 不更新 **输出:** ``` 2 3 ``` ✅ 与题目样例完全一致。 --- ## ⚠️ 注意事项 - 如果输入数据**全部相同**,则 `min2` 依然为 `INT_MAX`,输出会异常。题目一般保证存在不同元素,否则需特殊处理。 - 如果 n=1,只有一个数字,次小值不存在,但题目 n<100 且一般不会给 n=1 的用例,这里忽略。 - 使用 `INT_MAX` 需要包含 `<climits>` 头文件。 --- ## 💡 扩展建议 - 如果要求**严格次小值**(即必须小于最小值的第二小),算法相同。 - 如果要求**数值可重复且次小值等于最小值时也算**,则需判断 `num >= min1 && num < min2`,但题目通常要求不同值。 - 若数据规模很大,可考虑排序法 `O(n log n)`,但此方法 `O(n)` 更优。 - 可扩展为求前 k 小值,使用堆(优先队列)实现。 --- ## 📚 参考 - C++标准库 `<climits>` 中定义了 `INT_MAX`。 - 时间复杂度:`O(n)`,空间复杂度 `O(1)`。 --- ######[AI写代码神器 | 949点数解答 | 2026-08-21 19:33:53]

相关提问
本站限时免费提问中
实用工具查看更多
Linux在线手册 [开发类]
Jquery在线手册 [开发类]
今日油价 [生活类]
图片互转base64 [开发类]
时间转换器 [开发类]