题目:
力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
思路:
1、比对先前中毒的时间
上次中毒的持续时间=当前中毒时间-上次中毒时间
如果中毒的持续时间:timeSeries[i] - timeSeries[i-1] >= duration,走完中毒持续时间,
否则 timeSeries[i] - timeSeries[i-1] < duration ,没有走完中毒持续时间
最后需要一次中毒需要将维持duration,结果要加上duration。
2、单次扫描
记录未中毒的起始时间为expired,遭到攻击的时间为 timeSeries[i]。
如果当前未处于中毒的状态,现在的时间,如果比expired大和相等,说明是可以走完中毒时间的。
如果正处于中毒状态,且需要重新刷新expired,需要将当前中毒的持续时间减去expired,并更新expired的值为当前中毒时间,结果为差。
代码
1、比对先前中毒的时间
class Solution:
def findPoisonedDuration(self, timeSeries: List[int], duration: int) -> int:
res = 0
for i in range(1, len(timeSeries)):
gap = timeSeries[i] - timeSeries[i - 1] # 和上次攻击的间隙
if gap >= duration: # 如果大于持续时间,说明有秒数走完中毒持续时间
res += duration
else:
res += gap # 否则,加上秒数之间的间隔。
res += duration # 因为比对的是上一次中毒的时间,最后的元素需要加上持续的时间
return res
2、单次扫描
class Solution:
def findPoisonedDuration(self, timeSeries: List[int], duration: int) -> int:
res = expired = 0
for i in range(len(timeSeries)):
if timeSeries[i] >= expired: # 如果当前时间不在上次中毒持续时间内
res += duration
else:
res += timeSeries[i] + duration - expired # 本次中毒的持续时间
expired = timeSeries[i] + duration
return res