[Leetcode]495.提莫攻擊

AdamWong發表於2019-02-10

題目:

在《英雄聯盟》的世界中,有一個叫 “提莫” 的英雄,他的攻擊可以讓敵方英雄艾希(編者注:寒冰射手)進入中毒狀態。現在,給出提莫對艾希的攻擊時間序列和提莫攻擊的中毒持續時間,你需要輸出艾希的中毒狀態總時長。
你可以認為提莫在給定的時間點進行攻擊,並立即使艾希處於中毒狀態。
示例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;
    }
};

相關文章