[LeetCode]495. Teemo Attacking
时隔多日,又要开始继续重拾算法了;
题目:这道题目是一个披着游戏皮的数组题目,计算提莫总共攻击时长。
分为三种情况:
如果当前攻击时间点加上duration后超过了下一个时间点,那个显然下一个时间点就不用计算了,直到找到数组中没有超过的时间点再开始计算;
相反,如果是相等,说明下一个时间点是正好到达的,所以自己不用算,但是要算从下一个时间点后的duration,也就是需要加上duration-1的时长;
最后一种最好理解,相加没有到达下一个时间点的话,直接加上duration即可。
下面这种就是错误的想法,想着使用移动下标的方式来做,结果就是各种判断,后面直接果断给放弃了。
class Solution(object):
def findPoisonedDuration(self, timeSeries, duration):
"""
:type timeSeries: List[int]
:type duration: int
:rtype: int
"""
serie_len = len(timeSeries)
if serie_len == 0:
return 0
if serie_len == 1:
return duration
result = 0
idx = 0
last_idx = -1
while idx < serie_len:
if idx + 1 < serie_len:
if timeSeries[idx + 1] - timeSeries[idx] + 1 == duration:
if idx != 0:
result += duration - 1
else:
result += duration
elif timeSeries[idx + 1] - timeSeries[idx] + 1 < duration:
result += duration
last_serie = timeSeries[idx] + duration - 1
for j in range(idx + 1, serie_len):
if timeSeries[j] >= last_serie:
last_idx = idx
idx = j - 1
break
else:
result += duration
else:
if last_idx != -1:
if timeSeries[last_idx] + duration - 1 == timeSeries[-1]:
result += duration - 1
elif timeSeries[last_idx] + duration - 1 < timeSeries[-1]:
result += duration
last_idx = -1
else:
if timeSeries[idx - 1] + duration - 1 == timeSeries[-1]:
result += duration - 1
elif timeSeries[idx - 1] + duration - 1 < timeSeries[-1]:
result += duration
idx += 1
return result
哎,这么久没做了,贪心都给忘了,因为题目中也已经提到了是ascending,当前时间点到下一个时间点之间是肯定会被计算进来的,只不过是加上他们两点之间的差值还是说加上整个duration。
class Solution(object):
def findPoisonedDuration(self, timeSeries, duration):
"""
:type timeSeries: List[int]
:type duration: int
:rtype: int
"""
serie_len = len(timeSeries)
result = 0
for idx in range(1, serie_len):
result += min(timeSeries[idx] - timeSeries[idx-1], duration)
return result + duration if serie_len else 0
或者是记录下下一个攻击时间点,如果小于它的话则直接进行累加,如果大于等于它的话就结算总共花费的时间。