解题思路
本题是数组扫描 + 滑动窗口判定,可按以下步骤处理:
- 最高温度:线性扫描
temperatures,维护当前最大值及其首次出现下标(仅在严格变大时更新下标)。
- 危险时段枚举:对每个起点 i∈[0, n−k],检查长度 k 的窗口是否严格单调递增:
- 即对所有 j∈[i, i+k−2],需满足 temperatures[j]<temperatures[j+1];
- 相邻相等(如 2,2,3)不满足「严格递增」,不能计入。
- 阈值过滤:窗口合法时,计算升幅 temperatures[i+k−1]−temperatures[i],仅当 ≥t 时计为一个危险时段。
P5108.查找温度记录统计信息(100分)
题目内容
新能源电站配备了多个温度传感器,用于监测关键设备的运行温度,需要定期分析温度数据:找出历史最高温度记录,并检测是否存在温度异常升高的危险时段。
"危险时段" 定义为一段连续k个时间点的温度严格单调递增,且该时段内温度升高总幅度 ≥ 阈值t,这样的时段被标记为设备存在过热风险。
给定一个整数数组 temperatures,其中 temperatures[i] 表示第i个时间点的温度记录,请完成以下任务:
- 找出最高温度值及其首次出现的下标位置
- 统计所有 "危险时段" 的数量
- 找出温度升高幅度最大的 "危险时段" 的起始和结束位置
输入
-
temperatures: int[],温度记录序列,1 ≤ 长度 ≤ 10000,-100 ≤ temperatures[i] ≤ 100
-
k: int,危险时段所需的连续点数,2 ≤ k ≤ temperatures.length
-
t: int,连续升高的温度差值阈值,0 < t ≤ 100
输出
int[],长度为 5 的数组:[最高温度值, 最高温度首次出现下标, 危险时段数量, 最大危险时段起始位置, 最大危险时段结束位置]
补充说明
- 严格单调递增:
temperatures[i] < temperatures[i+1] < ... < temperatures[i+k-1]
- 若无危险时段,起始和结束位置均返回
-1
- 若多个危险时段升高幅度相同且最大,取起始位置最小的那个
- 下标从 0 开始计数
样例1
输入
8,[20,25,30,28,35,40,42,25],3,10
输出
[42,6,2,3,5]
说明
最高温度 42 度,出现在位置 6
危险时段检测(k=3,t=10):
- 位置 0−2:20→25→30,升高 10度 (≥10) ✓ 危险时段1
- 位置3−5:28→35→40,升高 12 度 (≥10) ✓ 危险时段 2
- 位置 4−6:35→40→42,升高 7 度 (<10) ✗ 不是危险时段
- 其他时段不满足条件
危险时段数量:2 个
升高幅度最大:位置 3−5(12 度)
样例2
输入
3,[10,15,20],3,30
输出
[20,2,0,-1,-1]
说明
- 位置 0−2:10→15→20(<30) 非危险时段
- 最高温度是20,位置下标为 2
- 危险时段 0个
- 危险时段起始位置为 −1,结束位置为 −1
样例3
输入
6,[1, 3, 6, 2, 4, 7],3,5
输出
[7,5,2,0,2]
说明
最高温度值:7
最高温度首次出现下标:5
危险时段检测(k=3,t=5):
- 位置0−2:1→3→6,升高5 度(≥5)✓ 危险时段 1
- 位置 3−5:2→4→7,升高 5 度 (≥5)✓ 危险时段 2
危险时段数量:2
最大危险时段起始位置:0(2 个相同最大温差,取第 1 个危险时段起始下标返回)
最大危险时段结束位置:2