题解:洛谷 P5724 求极差

【题目来源】

洛谷:P5724 【深基4.习5】求极差 / 最大跨度值 / 最大值和最小值的差

【题目描述】

给出 \(n\)\(n\) 个整数 \(a_i\),求这 \(n\) 个整数中的极差是什么。极差的意思是一组数中的最大值减去最小值的差。

【输入】

第一行输入一个正整数 \(n\),表示整数个数。

第二行输入 \(n\) 个整数 \(a_1,a_2,\dots,a_n\),以空格隔开。

【输出】

输出一个整数,表示这 \(n\) 个整数的极差。

【输入样例】

6
4 1 5 1 4 1

【输出样例】

4

【核心思想】

  1. 问题分析:给定 \(n\) 个整数,求极差(最大值减去最小值)。这是一个线性扫描求最值问题。

  2. 算法选择

    • 边读边比较:读入第一个数初始化最大最小值,后续每读一个数就更新最值,最后求差
  3. 关键步骤

    • 读入数据cin >> n(个数),cin >> a(第一个数)
    • 初始化max = a, min = a
    • 遍历剩余数\(i\)\(2\)\(n\)):
      • cin >> a:读入当前数
      • max < amax = a(更新最大值)
      • min > amin = a(更新最小值)
    • 输出极差max - min
  4. 时间/空间复杂度

    • 时间复杂度:\(O(n)\),需要遍历 \(n\) 个数
    • 空间复杂度:\(O(1)\),无需数组,边读边处理
  5. 边读边处理的核心思想

    • 即时更新:每读入一个数立即与当前最值比较,无需存储所有数
    • 空间优化:不存储整个序列,仅需维护最大最小两个变量,空间降至 \(O(1)\)
    • 初始化策略:用第一个数同时初始化最大和最小值,避免引入极值常量
    • 适用于最值查找、极差计算、流式处理类入门问题

【算法标签】

入门 #模拟

【代码详解】

#include <bits/stdc++.h>  // 包含标准库头文件(万能头文件)
using namespace std;      // 使用标准命名空间

/**
 * 主函数 - 程序入口
 * @return 程序执行状态码(0表示成功)
 */
int main()
{
    int n;               // 定义变量:数字个数n
    int a;               // 定义变量:当前输入的数字
    int max, min;        // 定义变量:最大值和最小值

    cin >> n;            // 输入数字个数
    cin >> a;            // 输入第一个数字

    // 初始化最大值和最小值为第一个数字
    max = a;
    min = a;

    // 遍历剩余的数字
    for (int i = 2; i <= n; i++)
    {
        cin >> a;        // 输入当前数字

        // 更新最大值
        if (max < a)
            max = a;

        // 更新最小值
        if (min > a)
            min = a;
    }

    // 输出最大值与最小值的差
    cout << max - min;

    return 0;            // 程序正常结束
}

【运行结果】

6
4 1 5 1 4 1
4
posted @ 2026-08-05 15:48  团爸讲算法  阅读(21)  评论(0)    收藏  举报