题目来源
题目描述
题目解析
遍历模拟
因为timeSeries为非递减排序,按照顺序进行遍历模拟即可。
我们使用ans
统计答案,使用last记录下一次攻击的结束点,对于任意timeSeries[i]
而言,假设其发起点为 s = timeSeries[i]
,结束点为 e = s + duration - 1
,针对 lastlast 和 ss 进行分情况讨论即可:
- last<s :两次攻击不重合,则有
ans += duration; last = e;
- last>=s :两次攻击重合,则有
ans += e - last; last = e
注意:last
作为上次的结束点,在处理 timeSeries[i]
时,last
是一个「已被统计」的存在,因此我们需要将其初始化为 -1
(使用一个比 00 小的数值作为哨兵),以确保当 timeSeries[0] = 0
时,第 0
秒能够被计数。
class Solution {
public:
int findPoisonedDuration(vector<int>& timeSeries, int duration) {
int ans = 0, last = -1;
for (int s : timeSeries) {
int e = s + duration - 1; // 本次持续时间
if(last < s){ // 没有和上次的重合
ans += duration; // 那么累加全部
}else{
ans += (e - last); // 否则,只加抵消了的
}
last = e;
}
return ans;
}
};