[LeetCode]495. Teemo Attacking

[LeetCode]495. Teemo Attacking

时隔多日,又要开始继续重拾算法了;

题目:这道题目是一个披着游戏皮的数组题目,计算提莫总共攻击时长。

分为三种情况:

  1. 如果当前攻击时间点加上duration后超过了下一个时间点,那个显然下一个时间点就不用计算了,直到找到数组中没有超过的时间点再开始计算;

  2. 相反,如果是相等,说明下一个时间点是正好到达的,所以自己不用算,但是要算从下一个时间点后的duration,也就是需要加上duration-1的时长;

  3. 最后一种最好理解,相加没有到达下一个时间点的话,直接加上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

或者是记录下下一个攻击时间点,如果小于它的话则直接进行累加,如果大于等于它的话就结算总共花费的时间。

posted @ 2018-05-01 15:48  banananana  阅读(283)  评论(0编辑  收藏  举报