题解
找出谁是第二高
1 条题解
-
0
解题思路
"找出第二高",最直接的办法就是找两遍:
第一遍:从头到尾扫描,找出最高的同学,记住他的位置
maxp。就像赛跑先看看谁是第一名。第二遍:再从头到尾扫描,但跳过第一名(
i == maxp就不看),在剩下的人里再找出最高的——这个人就是全班第二高啦!打个比方:想找全班第二高,先找出最高的人让他出列,剩下的人里最高的自然就是第二高。
注意:题目说身高没有重复,所以不用担心"最高和第二高一样高"的情况。
还有个小坑:输出格式题目里写了"学号以及他的身高",样例输出也是
7 159(先学号后身高),所以输出顺序是 学号 身高,别搞反了哦。参考代码
// P4474 找出谁是第二高:先找最高,再在其余人中找最高(即第二高),输出学号与身高 #include <iostream> using namespace std; int main() { int n; cin >> n; int a[1005]; int maxp = 0; // 最高同学的位置 for (int i = 0; i < n; i++) { cin >> a[i]; if (a[i] > a[maxp]) maxp = i; // 第一遍找最高的同学 } int p = -1; // 第二高同学的位置,先设成-1表示还没找到 for (int i = 0; i < n; i++) { if (i == maxp) continue; // 跳过最高的同学 if (p == -1 || a[i] > a[p]) p = i; // 剩下的人里找最高的 } cout << (p + 1) << ' ' << a[p] << endl; // 输出学号(下标+1)和身高 return 0; }复杂度分析
- 时间:找最高扫一遍 O(n),找第二高再扫一遍 O(n),总共 O(n),非常快。
- 空间:用数组存了 n 个身高,是 O(n)。
- 1