Adam's blog
Published by Adam

[Leetcode]495.提莫攻击

题目:

在《英雄联盟》的世界中,有一个叫 “提莫” 的英雄,他的攻击可以让敌方英雄艾希(编者注:寒冰射手)进入中毒状态。现在,给出提莫对艾希的攻击时间序列和提莫攻击的中毒持续时间,你需要输出艾希的中毒状态总时长。
你可以认为提莫在给定的时间点进行攻击,并立即使艾希处于中毒状态。
示例1:

输入: [1,4], 2

输出: 4

原因: 在第 1 秒开始时,提莫开始对艾希进行攻击并使其立即中毒。中毒状态会维持 2 秒钟,直到第 2 秒钟结束。
在第 4 秒开始时,提莫再次攻击艾希,使得艾希获得另外 2 秒的中毒时间。
所以最终输出 4 秒。

示例2:

输入: [1,2], 2
输出: 3

原因: 在第 1 秒开始时,提莫开始对艾希进行攻击并使其立即中毒。中毒状态会维持 2 秒钟,直到第 2 秒钟结束。
但是在第 2 秒开始时,提莫再次攻击了已经处于中毒状态的艾希。
由于中毒状态不可叠加,提莫在第 2 秒开始时的这次攻击会在第 3 秒钟结束。
所以最终输出 3。

条件转化

这种方法主要是通过比较时间间距和每次的中毒状态时间,如果时间间距更大艾希就会经历一个完整的中毒状态时间。如果中毒状态时间更长,那么实际上中毒状态还没结束艾希就又中了一次毒,这样只需要加上间隔时间,
用数学表达式来描述就是:
AllTime+=min(Time,duration)

class Solution {
public:
  int findPoisonedDuration(vector<int>& timeSeries, int duration) {
      int cnt=0,length=timeSeries.size();
      if(length==0)return 0;
      for(int i=1;i<length;i++){
          int time=timeSeries[i]-timeSeries[i-1];
          if(time<duration){
              cnt+=time;
          }else{
              cnt+=duration;
          }
 	}
    cnt+=duration;
	return cnt;
	}
};

一种细微优化的处理方法,比较endTime即结束的时间,这样的优势在于不用像timeSeries[i]-timeSeries[i-1]一样读取内存(参照CSAPP),效率会更高。

class Solution {
public:
    int findPoisonedDuration(vector<int>& timeSeries, int duration) {
        int endTime = -1,sum = 0;
        for(auto& i:timeSeries){
            /*判断timeSeries中的发射时间与上一次中毒失效的时间*/
            if(i>=endTime){
                sum+=duration;
            }
            else{
                /* waste some time because of the coincide*/
                sum+=i+duration-endTime;
            }
            /* change the endTime*/
            endTime=i+duration;
        }
        return sum;
    }
};
posted @ 2019-02-10 16:18  AdamWong  阅读(522)  评论(0编辑  收藏  举报