C++ 数组最小值与次小值查找实现详解
## 🧮 问题分析 这个问题要求从 n 个整数中找出 **最小值** 和 **次小值**。需要注意的是,这里的次小值是指 **严格大于最小值** 的下一个最小值,而不是相等元素。 --- ## 💡 解题思路 **核心思想:** 1. 遍历数组,同时维护 `min1`(最小值)和 `min2`(次小值) 2. 初始化时,`min1` 和 `min2` 都设为极大值 3. 遍历每个元素时,分三种情况更新: - 当前元素 `< min1`:原最小值降为次小值,当前元素成为新最小值 - 当前元素 `> min1` 且 `< min2`:更新次小值 - 当前元素 `== min1`:不更新(保证次小值严格大于最小值) **边界情况:** - n < 2 时(题目未明确,但 n < 100,默认至少为 2 才合理) - 所有元素相同(此时次小值不存在,但题目测试数据不会出现这种情况) --- ## 🚀 完整 C++ 代码实现 ```cpp #include <iostream> #include <climits> // 用于 INT_MAX using namespace std; int main() { int n; cin >> n; // 初始化:使用 INT_MAX 确保首次赋值正确 int min1 = INT_MAX; // 最小值 int min2 = INT_MAX; // 次小值 // 遍历输入 for (int i = 0; i < n; i++) { int num; cin >> num; // 更新最小值 if (num < min1) { min2 = min1; // 原最小值降级为次小值 min1 = num; // 更新最小值 } // 更新次小值(严格大于最小值) else if (num > min1 && num < min2) { min2 = num; } // 若 num == min1,不更新,保证次小值严格大于最小值 } // 输出结果 cout << min1 << " " << min2 << endl; return 0; } ``` --- ## 🧪 输入输出演示 **样例输入:** ``` 5 3 4 5 2 6 ``` **执行过程:** | 步骤 | 输入数字 | min1 | min2 | 说明 | |------|---------|------|------|------| | 初始 | - | INT_MAX | INT_MAX | - | | 1 | 3 | 3 | INT_MAX | 3 < min1,更新 min1 | | 2 | 4 | 3 | 4 | 4 > 3 且 < INT_MAX | | 3 | 5 | 3 | 4 | 5 > min2,忽略 | | 4 | 2 | 2 | 3 | 2 < min1,原 min1 变为次小 | | 5 | 6 | 2 | 3 | 6 忽略 | **输出:** ``` 2 3 ``` --- ## 📦 代码优化与扩展 ### ⏱️ 算法复杂度 - **时间复杂度**:`O(n)`,单次遍历 - **空间复杂度**:`O(1)`,仅使用常数个变量 ### 🛠️ 避免的陷阱 1. **相等元素处理**:若数组为 `[5, 5, 3]`,次小值应为 `5` 还是 `3`?我们按“严格大于最小值”处理,输出 `3 5`,这符合大多数题目的语义。 2. **n = 1 的情况**:需要特殊处理,但题目保证 n < 100,通常至少为 2,若需健壮性可加判断。 ### 🧩 变体:不严格大于(允许相等) 如果次小值定义为“可以等于最小值”(即找出两个不同的下标),则将条件 `num > min1` 改为 `num >= min1` 即可。 ### 📌 开发建议 - 使用 `INT_MAX` 而非 `2147483647` 硬编码,增强可读性和可移植性 - 注意变量命名清晰(`min1`/`min2` 比 `a`/`b` 更好) - 对于大数据量,可考虑输入流优化(`ios::sync_with_stdio(false)`) --- ## 📚 学习资源 - **C++ 基础遍历与条件判断**:[cppreference.com](https://en.cppreference.com/w/) - **算法入门**:《算法竞赛入门经典》(刘汝佳) - **在线练习**:[洛谷 P1152](https://www.luogu.com.cn/) 等基础题 ######[AI写代码神器 | 1098点数解答 | 2026-08-08 11:32:19]
- Python 实现球类:精准计算半径、表面积与体积,附输入验证与异常处理!(阿里通义 | 261点数解答 | 2024-11-28 21:19:39)556
- 深度揭秘 Oracle Workarea Size Policy:参数调优助力数据库性能飞升(阿里通义 | 372点数解答 | 2024-05-13 10:54:45)341
- C++实现计算最少添加数字次数以匹配两个数组元素(字节豆包 | 714点数解答 | 2026-03-08 19:44:54)89
- 51 单片机:定时器 0 实现 8 个 LED 循环点亮,附代码及优化建议(字节豆包 | 1193点数解答 | 2024-12-27 15:10:29)470
- C++ 实现:合并 k 个有序数组并求所有数的中位数(附代码及复杂度分析) (阿里通义 | 203点数解答 | 2023-11-09 00:50:21)276
- 2023 - 2024 年中国制造业与非制造业 PMI 数据深度剖析:为政策与决策提供参考 (讯飞星火 | 54点数解答 | 2024-12-17 09:25:02)179
- 深挖2023 - 2024年中国制造业与非制造业PMI数据:多元统计剖析经济运行特点 (讯飞星火 | 235点数解答 | 2024-12-17 09:25:13)157
- Python 实现:输入三个数并输出最大、最小及平均值,附异常处理要点(字节豆包 | 210点数解答 | 2025-01-25 12:23:39)243
- 地下水及地基土腐蚀性分析:从代码优化到逻辑完善的全面攻略(DeepSeek | 498点数解答 | 2025-06-08 21:49:49)272
- 使用 C++ 找出全息偶像总决选人气最稳定的偶像(字节豆包 | 502点数解答 | 2026-03-08 10:20:28)51
- 礼盒多级排序:总价→最贵→最便宜→编号的 Python 实现与详解(阿里通义 | 1000点数解答 | 2026-03-16 12:13:21)97
- Linux开发:用find命令查找/usr目录下超1MB的文件(百度文心 | 153点数解答 | 2023-11-09 18:45:10)262