题解:洛谷 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
【核心思想】
-
问题分析:给定 \(n\) 个整数,求极差(最大值减去最小值)。这是一个线性扫描求最值问题。
-
算法选择:
- 边读边比较:读入第一个数初始化最大最小值,后续每读一个数就更新最值,最后求差
-
关键步骤:
- 读入数据:
cin >> n(个数),cin >> a(第一个数) - 初始化:
max = a, min = a - 遍历剩余数(\(i\) 从 \(2\) 到 \(n\)):
cin >> a:读入当前数- 若
max < a:max = a(更新最大值) - 若
min > a:min = a(更新最小值)
- 输出极差:
max - min
- 读入数据:
-
时间/空间复杂度:
- 时间复杂度:\(O(n)\),需要遍历 \(n\) 个数
- 空间复杂度:\(O(1)\),无需数组,边读边处理
-
边读边处理的核心思想:
- 即时更新:每读入一个数立即与当前最值比较,无需存储所有数
- 空间优化:不存储整个序列,仅需维护最大最小两个变量,空间降至 \(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
浙公网安备 33010602011771号