算法小知识----11.14----提莫攻击

119 阅读2分钟

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

提莫攻击

该题出自力扣的495题——提莫攻击;题解是自己做的

审题

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

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

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

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

  • 一通背景介绍,关于本题的意思就是,给一个数组,一个区间值,如果数组内的值之间的区间 < 给定的区间值;计算区间差值;统计最大区间

  • 其实是有点数学题的概念,就看能不能领悟透,我们只需要对数组进行一次扫描就可以计算出总的中毒持续时间。

  • 据题意,在 数组间值 < 区间时:

    • a = 数组之间的区间差 = (timeSeries[i] - timeSeries[i-1])
    • b = 首次毒针后剩余时间 = duration - a
    • c = 重置毒针后应该加的时间 = duration - b
    • res = 毒针维持时间 = res + c = res+(timeSeries[i] - timeSeries[i-1])
  • 我们将每次中毒后增加的持续中毒时间相加即为总的持续中毒时间。

编码

    public static int findPoisonedDuration(int[] timeSeries, int duration) {
        int res= duration;
        int last = timeSeries[0];
        for (int i = 1; i < timeSeries.length; i++) {
            if (timeSeries[i] - last < duration){
                res += timeSeries[i] -last;
                last = timeSeries[i];
                continue;
            }
            res += duration;
            last = timeSeries[i];
        }
        return res;
    }
  • 时间复杂度:O(n),其中 n 是数组 timeSeries 的长度。我们只需要遍历一遍数组即可,因此总时间复杂度为 O(n)。

  • 空间复杂度:O(1)。只需要记录未中毒的起始时间即可,因此时间复杂度为 O(1)。

1636512240(1).jpg