跳至主要內容

495. 提莫攻击


495. 提莫攻击

🟢   🔖  数组 模拟  🔗 力扣open in new window LeetCodeopen in new window

题目

Our hero Teemo is attacking an enemy Ashe with poison attacks! When Teemo attacks Ashe, Ashe gets poisoned for a exactly duration seconds. More formally, an attack at second t will mean Ashe is poisoned during the inclusive time interval [t, t + duration - 1]. If Teemo attacks again before the poison effect ends, the timer for it is reset , and the poison effect will end duration seconds after the new attack.

You are given a non-decreasing integer array timeSeries, where timeSeries[i] denotes that Teemo attacks Ashe at second timeSeries[i], and an integer duration.

Return thetotal number of seconds that Ashe is poisoned.

Example 1:

Input: timeSeries = [1,4], duration = 2

Output: 4

Explanation: Teemo's attacks on Ashe go as follows:

  • At second 1, Teemo attacks, and Ashe is poisoned for seconds 1 and 2.
  • At second 4, Teemo attacks, and Ashe is poisoned for seconds 4 and 5.

Ashe is poisoned for seconds 1, 2, 4, and 5, which is 4 seconds in total.

Example 2:

Input: timeSeries = [1,2], duration = 2

Output: 3

Explanation: Teemo's attacks on Ashe go as follows:

  • At second 1, Teemo attacks, and Ashe is poisoned for seconds 1 and 2.
  • At second 2 however, Teemo attacks again and resets the poison timer. Ashe is poisoned for seconds 2 and 3.

Ashe is poisoned for seconds 1, 2, and 3, which is 3 seconds in total.

Constraints:

  • 1 <= timeSeries.length <= 10^4
  • 0 <= timeSeries[i], duration <= 10^7
  • timeSeries is sorted in non-decreasing order.

题目大意

在《英雄联盟》的世界中,有一个叫 “提莫” 的英雄。他的攻击可以让敌方英雄艾希(编者注:寒冰射手)进入中毒状态。

当提莫攻击艾希,艾希的中毒状态正好持续 duration 秒。

正式地讲,提莫在 t 发起攻击意味着艾希在时间区间 [t, t + duration - 1](含 tt + duration - 1)处于中毒状态。如果提莫在中毒影响结束 再次攻击,中毒状态计时器将会 重置 ,在新的攻击之后,中毒影响将会在 duration 秒后结束。

给你一个 非递减 的整数数组 timeSeries ,其中 timeSeries[i] 表示提莫在 timeSeries[i] 秒时对艾希发起攻击,以及一个表示中毒持续时间的整数 duration

返回艾希处于中毒状态的 秒数。

示例 1:

输入: timeSeries = [1,4], duration = 2

输出: 4

解释: 提莫攻击对艾希的影响如下:

  • 第 1 秒,提莫攻击艾希并使其立即中毒。中毒状态会维持 2 秒,即第 1 秒和第 2 秒。
  • 第 4 秒,提莫再次攻击艾希,艾希中毒状态又持续 2 秒,即第 4 秒和第 5 秒。

艾希在第 1、2、4、5 秒处于中毒状态,所以总中毒秒数是 4 。

示例 2:

输入: timeSeries = [1,2], duration = 2

输出: 3

解释: 提莫攻击对艾希的影响如下:

  • 第 1 秒,提莫攻击艾希并使其立即中毒。中毒状态会维持 2 秒,即第 1 秒和第 2 秒。
  • 第 2 秒,提莫再次攻击艾希,并重置中毒计时器,艾希中毒状态需要持续 2 秒,即第 2 秒和第 3 秒。

艾希在第 1、2、3 秒处于中毒状态,所以总中毒秒数是 3 。

提示:

  • 1 <= timeSeries.length <= 10^4
  • 0 <= timeSeries[i], duration <= 10^7
  • timeSeries非递减 顺序排列

解题思路

  1. 维护变量

    • 使用一个变量 total 来累加中毒的总时间。
    • 使用变量 end 来表示上一次中毒的结束时间。
  2. 理解时间重叠

    • 如果某次攻击的时间 timeSeries[i] 与上一次攻击的结束时间 end 重叠,即 timeSeries[i] < end,那么实际的中毒时间要扣除重叠部分。
    • 如果不重叠,则正常加上 duration
  3. 遍历攻击时间数组

    • 对于每个攻击时间 time
      • 首先假设中毒持续时间是 duration,累加到 total
      • 如果当前攻击时间 time 小于 end,说明存在重叠部分,需要从 total 中减去重叠的时间 (end - time)
      • 更新当前中毒的结束时间 end = time + duration
  4. 返回结果

    • 遍历完所有攻击时间后,返回总的中毒时间 total

复杂度分析

  • 时间复杂度O(n),其中 n 是攻击次数的数量,需要遍历 timeSeries 数组。
  • 空间复杂度O(1),使用了常数个变量。

代码

/**
 * @param {number[]} timeSeries
 * @param {number} duration
 * @return {number}
 */
var findPoisonedDuration = function (timeSeries, duration) {
	let total = 0; // 总中毒时间
	let end = 0; // 上一次中毒的结束时间

	for (let time of timeSeries) {
		total += duration; // 假设当前攻击完全贡献持续时间
		if (time < end) {
			// 如果当前攻击与上一次中毒时间重叠
			total -= end - time; // 减去重叠的时间
		}
		end = time + duration; // 更新结束时间
	}

	return total;
};

相关题目

题号标题题解标签难度力扣
56合并区间[✓]数组 排序🟠🀄️open in new window 🔗open in new window
605种花问题[✓]贪心 数组🟢🀄️open in new window 🔗open in new window
649Dota2 参议院[✓]贪心 队列 字符串🟠🀄️open in new window 🔗open in new window