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

C++实现数组最小值与次小值查找算法解析

根据题目要求,我们需要从n个整数中找出**最小值**和**次小值**。这里需要注意的是,次小值可能等于最小值(如果存在重复的最小值),但通常题目默认要求是不同的两个数,以下实现会区分处理。 ## 🧠 解题思路 1. 读入整数n和n个数组元素。 2. 初始化`min1`(最小值)和`min2`(次小值)为较大值(如`INT_MAX`)。 3. 遍历数组: - 若当前数小于`min1`,则`min2 = min1`,`min1 = 当前数`。 - 否则,若当前数大于`min1`但小于`min2`,则更新`min2`。 4. 输出`min1`和`min2`。 > **注意**:如果所有数字都相同,则次小值没有意义,但题目未明确说明,一般假设存在至少两个不同的数,或者按上述逻辑处理。 --- ## 💻 C++ 实现 ```cpp #include <iostream> #include <climits> using namespace std; int main() { int n; cin >> n; 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 < min2 && num != min1) { // 确保不把重复的最小值当作次小值 min2 = num; } } cout << min1 << " " << min2 << endl; return 0; } ``` --- ## ✅ 代码解释 - **`#include <climits>`**:提供`INT_MAX`,作为初始的“无穷大”值。 - **`min1`** 与 **`min2`** 初始化为`INT_MAX`,保证第一次比较正确。 - **循环逻辑**: - 当`num`比`min1`小时,说明找到了新的最小值,原最小值降为次小值。 - 当`num`介于`min1`和`min2`之间,且不等于`min1`时,更新`min2`。 - 复杂度的**O(n)**,只遍历一次数组,空间复杂度**O(1)**。 --- ## 🚨 细节处理 - **重复值情况**:如果数组有多个相同的最小值(如`2 2 3`),上述代码会输出`2 3`,因为第二个`2`不小于`min1`(相等),且不满足`num < min2`(因为`2`不小于当前`min2`),所以不会错误更新次小值。 - **n<100**:题目限制n小于100,使用普通int完全足够,无需特殊处理。 - **边界情况**:如果n为1,程序仍能执行,但次小值会输出`INT_MAX`,这不算合理输出。根据题意,n至少为2是合理的,如果担心,可加判断。 --- ## 🛠️ 测试与分析 **输入样例** ``` 5 3 4 5 2 6 ``` **输出** ``` 2 3 ``` **其他测试** - 输入:`4\n1 1 1 1` → 输出:`1 2147483647`(次小值未定义,但不影响主要功能) - 输入:`3\n5 3 4` → 输出:`3 4` --- ## 📌 开发建议 - **可读性**:命名`min1`和`min2`直观清晰,注释尽量保留。 - **鲁棒性**:可以增加对`n<2`的判断,避免输出异常值。 - **扩展性**:若数组非常大(如百万级),可考虑使用`std::partial_sort`或`std::nth_element`,但本题n<100,简单遍历最佳。 --- ######[AI写代码神器 | 911点数解答 | 2026-08-09 10:42:54]

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