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