题解
最大跨度值
1 条题解
-
0
解题思路
“最大跨度值”就是这一组数里最大值减去最小值的差。所以我们的任务就是:在一组数里找出最大值和最小值,再做一次减法。
“打擂台”的方法在这里非常合适:
- 先读入 n,表示这一组一共有多少个数;
- 读入第一个数,把它同时当作当前最大值 max 和当前最小值 min(擂主先由第一个数来当);
- 用一个循环读入剩下的数,每读入一个数 x,就让 x 上台挑战:
- 如果 x > max,说明出现了更大的数,更新 max = x;
- 如果 x < min,说明出现了更小的数,更新 min = x;
- 循环结束后,max 是最大值,min 是最小值,输出 max - min 就是最大跨度值。
为什么要把第一个数同时设为 max 和 min?因为只有先有一个人当擂主,后面的数才有比较的对象。如果一开始把 max 和 min 都设成 0,万一所有数都比 0 小,max 就会一直错误地停在 0,答案就错了。用第一个数初始化是最稳妥的做法。
另外还要注意:更新 max 和 min 要用两个独立的 if,不能写成 else if。因为同一个数可能既比当前最大值大,又比当前最小值小(当它前面只有第一个数时),两个判断都要做。
参考代码
#include using namespace std;
int main() { int n; // n 表示序列里有多少个数 cin >> n; // 读入个数
int x; // x 用来临时存放当前读入的数 cin >> x; // 先读入第一个数 int max = x; // 第一个数暂定为最大值 int min = x; // 第一个数也暂定为最小值 for (int i = 2; i <= n; i = i + 1) { // 从第 2 个数开始,读到第 n 个 cin >> x; // 读入下一个数 if (x > max) { // 比当前最大值还大 max = x; // 更新最大值 } if (x < min) { // 比当前最小值还小 min = x; // 更新最小值 } } cout << max - min << endl; // 最大跨度值 = 最大值 - 最小值 return 0;}
复杂度分析
题目中 n 表示序列的长度,最大为 1000。循环从 i = 2 执行到 i = n,每个数只被处理一次,一共处理 n 个数,所以时间复杂度是 O(n)。程序只用了 4 个 int 变量,不管 n 是多大,占用的空间都固定,空间复杂度是 O(1)。
- 1