top1编程
← 返回题目
题解

最大跨度值

1 条题解

  • 0
    @ 2026-8-4 10:39:06

    解题思路

    “最大跨度值”就是这一组数里最大值减去最小值的差。所以我们的任务就是:在一组数里找出最大值和最小值,再做一次减法。

    “打擂台”的方法在这里非常合适:

    1. 先读入 n,表示这一组一共有多少个数;
    2. 读入第一个数,把它同时当作当前最大值 max 和当前最小值 min(擂主先由第一个数来当);
    3. 用一个循环读入剩下的数,每读入一个数 x,就让 x 上台挑战:
      • 如果 x > max,说明出现了更大的数,更新 max = x;
      • 如果 x < min,说明出现了更小的数,更新 min = x;
    4. 循环结束后,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