leetcode 495------题目(提莫攻击)

87 阅读3分钟

「这是我参与11月更文挑战的第1天,活动详情查看:2021最后一次更文挑战

题目(提莫攻击,leetcode 495)

在《英雄联盟》的世界中,有一个叫 “提莫” 的英雄。他的攻击可以让敌方英雄艾希(编者注:寒冰射手)进入中毒状态。
当提莫攻击艾希,艾希的中毒状态正好持续 duration 秒。
正式地讲,提莫在 t 发起发起攻击意味着艾希在时间区间 [t, t + duration - 1](含 t 和 t + 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 <= 104
0 <= timeSeries[i], duration <= 107
timeSeries 按 非递减 顺序排列

来源:力扣(LeetCode)
链接:leetcode-cn.com/problems/te…
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

题解

今天这个题属于简单类题目,别看它说一堆,其实核心很简单。我们先把题目提炼出来。我们先来解析一下,就是:如果提莫在艾希中毒状态发起攻击,那么就重置艾希中毒持续时间。这个分析着咋那么熟悉呢?是的,就像是我们的防抖的原理是一样的。
这儿我们是需要计算这个中毒状态持续时间,我们还是分三步:

  • 临界情况判断
  var findPoisonedDuration = function(timeSeries, duration) {
    // 没有攻击
    if(timeSeries.lemgth===0) return 0;
    // 一次攻击
    if(timeSeries.length===1) return duration;
    let total = 0;
    ....
    // 最后一次攻击一定是duration的中毒状态
    total += duration;
  }

  • 在中毒状态下再次发起攻击 这儿是最需要注意的点,就是重置。重置的话,我们的中毒状态是没有那么长的。只有上一次攻击到这一次攻击的时间
  if(timeSeries[i]-timeSeries[i-1]<duration) {
    total += timeSeries[i]-timeSeries[i-1]
  }
  • 在非中毒状态下发起攻击
  if(timeSeries[i]-timeSeries[i-1]>=duration) {
    total += duration
  }

完整代码

/**
 * @param {number[]} timeSeries
 * @param {number} duration
 * @return {number}
 */
var findPoisonedDuration = function(timeSeries, duration) {
    if(timeSeries.lemgth===0) return 0;
    if(timeSeries.length===1) return duration;
    let total = 0;
    for(let i=1;i<timeSeries.length;i++) {
        if(timeSeries[i]-timeSeries[i-1]<duration) {
            total += timeSeries[i]-timeSeries[i-1]
        } else {
            total += duration;
        }
    }
    total += duration;
    return total;
};

小结

总体来说,这个题没有什么难度,确实只有简单的难度,唯一需要注意的就是在中毒状态下再次攻击的重置。工作之余刷刷题,不管简易,大家一起练习学习。