495. Teemo 攻击
原题连接:https://leetcode.com/articles/teemo-attacking/
在LOL中,英雄Teemo 他的攻击能够是对方中毒。那么现在给出Teemo 攻击Ashe的时间序列和中毒时间,计算出Ashe整体的中毒时间。
你可以假设Teemo 在特定时间点开始进行攻击,并使Ashe立即处于中毒状态。
例1:
输入:[1,4],2
输出:4
说明:在时间点1,Teemo开始攻击Ashe并使其立即中毒,其中毒状态持续2秒,到时间点2结束。
在时间点4,Teemo再次攻击Ashe,并使其中毒,中毒状态持续2秒。
所以最后输出中毒时长为4。
例2:
输入:[1,2],2
输出:3
说明:在时间点1,Teemo开始攻击Ashe并使其立即中毒,其中毒状态持续2秒,到时间点2结束。
然而,在时间点2,Teemo再次攻击Ashe,当前Ashe已经处于中毒状态。
由于中毒状态不会叠加,所以中毒时间被重置,到时间点3结束。
所以最后输出中毒时长为3。
注意:
- 假定给定时间序列数组长度不会超过10000。
- 假定Teemo的攻击时间序列中数据和每次攻击中毒时长都是非负整数,并不会超过10,000,000。
解:
分析
问题本质是合并区间问题,我们只需要考虑两次之间的攻击间隔与中毒持续时长之间的大小即可:
如果两次攻击间隔小于中毒持续时间,则中毒时间为攻击间隔;否则,即为中毒持续时间。
当然最后一次攻击不用比较,中毒时间肯定为整个中毒持续时间。
代码实现
class Solution {
public int findPoisonedDuration(int[] timeSeries, int duration) {
int n = timeSeries.length;
if (n == 0) return 0;
int total = 0;
for (int i = 0; i < n - 1; ++i)
//这里判断两次攻击的时间间隔与中毒持续时间的大小
total += Math.min(timeSeries[i + 1] - timeSeries[i], duration);
//最后要加上最后一次攻击的中毒持续时间
return total + duration;
}
}