1. 程式人生 > 實用技巧 >提莫攻擊

提莫攻擊

提莫攻擊

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

示例

輸入: [1,4], 2
輸出: 4
原因: 第 1 秒初,提莫開始對艾希進行攻擊並使其立即中毒。中毒狀態會維持 2 秒鐘,直到第 2 秒末結束。
第 4 秒初,提莫再次攻擊艾希,使得艾希獲得另外 2 秒中毒時間。
所以最終輸出 4 秒。
輸入: [1,2], 2
輸出: 3
原因: 第 1 秒初,提莫開始對艾希進行攻擊並使其立即中毒。中毒狀態會維持 2 秒鐘,直到第 2 秒末結束。
但是第 2 秒初,提莫再次攻擊了已經處於中毒狀態的艾希。
由於中毒狀態不可疊加,提莫在第 2 秒初的這次攻擊會在第 3 秒末結束。
所以最終輸出 3 。

題解

/**
 * @param {number[]} timeSeries
 * @param {number} duration
 * @return {number}
 */
var findPoisonedDuration = function(timeSeries, duration) {
    var n = timeSeries.length;
    if(!n) return 0;
    var target = 0;
    for(let i=0;i<n-1;++i) {
        target += Math.min(timeSeries[i+1] - timeSeries[i], duration);
    }
    return target + duration;
};

思路

將陣列進行一次遍歷即可,比較陣列中每兩個時間節點的差與中毒時間的長短,如果兩個節點之間的差比中毒時間短,那麼說明中毒的時間會被覆蓋,如果節點時間間隔長,那麼說明中毒狀態會持續duration時常,那麼直接取兩者之間小的值即可,首先定義n取得陣列長度,如果長度為0直接返回0即可,定義target為中毒總時間,然後定義迴圈取得陣列中時間節點值之差與中毒持續時間較小的值累加到target中,最後認為在最後一個節點還會持續中毒duration市場,所以將targetduration相加返回即可。

每日一題

https://github.com/WindrunnerMax/EveryDay

參考

https://leetcode-cn.com/problems/teemo-attacking