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]
- Python 实现球类:精准计算半径、表面积与体积,附输入验证与异常处理!(阿里通义 | 261点数解答 | 2024-11-28 21:19:39)563
- 深度揭秘 Oracle Workarea Size Policy:参数调优助力数据库性能飞升(阿里通义 | 372点数解答 | 2024-05-13 10:54:45)349
- Java 实现通用文件存储系统:含随机读写与空闲空间回收(字节豆包 | 686点数解答 | 2024-11-21 16:25:51)308
- Python 实现:统计玩具工厂红蓝色积木数量(字节豆包 | 169点数解答 | 2025-11-11 21:29:06)193
- Python 实现:统计红蓝色积木数量的详细攻略(字节豆包 | 299点数解答 | 2025-11-11 21:30:03)178
- C++实现计算最少添加数字次数以匹配两个数组元素(字节豆包 | 714点数解答 | 2026-03-08 19:44:54)97
- 51 单片机:定时器 0 实现 8 个 LED 循环点亮,附代码及优化建议(字节豆包 | 1193点数解答 | 2024-12-27 15:10:29)477
- C++ 实现:合并 k 个有序数组并求所有数的中位数(附代码及复杂度分析) (阿里通义 | 203点数解答 | 2023-11-09 00:50:21)283
- 2023 - 2024 年中国制造业与非制造业 PMI 数据深度剖析:为政策与决策提供参考 (讯飞星火 | 54点数解答 | 2024-12-17 09:25:02)183
- 深挖2023 - 2024年中国制造业与非制造业PMI数据:多元统计剖析经济运行特点 (讯飞星火 | 235点数解答 | 2024-12-17 09:25:13)160
- Python 实现:输入三个数并输出最大、最小及平均值,附异常处理要点(字节豆包 | 210点数解答 | 2025-01-25 12:23:39)246
- 地下水及地基土腐蚀性分析:从代码优化到逻辑完善的全面攻略(DeepSeek | 498点数解答 | 2025-06-08 21:49:49)276