这是我参与11月更文挑战的第14天,活动详情查看:2021最后一次更文挑战
提莫攻击
该题出自力扣的495题——提莫攻击;题解是自己做的
审题
在《英雄联盟》的世界中,有一个叫 “提莫” 的英雄。他的攻击可以让敌方英雄艾希(编者注:寒冰射手)进入中毒状态。
当提莫攻击艾希,艾希的中毒状态正好持续 duration 秒。
正式地讲,提莫在 t 发起发起攻击意味着艾希在时间区间 [t, t + duration - 1](含 t 和 t + duration - 1)处于中毒状态。如果提莫在中毒影响结束 前 再次攻击,中毒状态计时器将会 重置 ,在新的攻击之后,中毒影响将会在 duration 秒后结束。
给你一个 非递减 的整数数组 timeSeries ,其中 timeSeries[i] 表示提莫在 timeSeries[i] 秒时对艾希发起攻击,以及一个表示中毒持续时间的整数 duration 。
-
一通背景介绍,关于本题的意思就是,给一个数组,一个区间值,如果数组内的值之间的区间 < 给定的区间值;计算区间差值;统计最大区间
-
其实是有点数学题的概念,就看能不能领悟透,我们只需要对数组进行一次扫描就可以计算出总的中毒持续时间。
-
据题意,在 数组间值 < 区间时:
- a = 数组之间的区间差 = (timeSeries[i] - timeSeries[i-1])
- b = 首次毒针后剩余时间 = duration - a
- c = 重置毒针后应该加的时间 = duration - b
- res = 毒针维持时间 = res + c = res+(timeSeries[i] - timeSeries[i-1])
-
我们将每次中毒后增加的持续中毒时间相加即为总的持续中毒时间。
编码
public static int findPoisonedDuration(int[] timeSeries, int duration) {
int res= duration;
int last = timeSeries[0];
for (int i = 1; i < timeSeries.length; i++) {
if (timeSeries[i] - last < duration){
res += timeSeries[i] -last;
last = timeSeries[i];
continue;
}
res += duration;
last = timeSeries[i];
}
return res;
}
-
时间复杂度:O(n),其中 n 是数组 timeSeries 的长度。我们只需要遍历一遍数组即可,因此总时间复杂度为 O(n)。
-
空间复杂度:O(1)。只需要记录未中毒的起始时间即可,因此时间复杂度为 O(1)。