• [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

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

  • 相关阅读:
    protobuf 协议 windows 下 C++ 环境搭建
    protobuf 协议 windows 下 java 环境搭建
    ProtocolBuffers (二) android与PC,C#与Java 利用protobuf 进行无障碍通讯【Socket】
    C++ ofstream和ifstream详细用法
    C# 关于out和ref的问题
    java 解析office文件 大全
    Ezhuang
    IOS
    Android Client and PHP Server
    一个IM开源项目LiteTalk
  • 原文地址:https://www.cnblogs.com/George1994/p/8976431.html
Copyright © 2020-2023  润新知