【面试-leetcode495】提莫攻击(暴力+线性扫描)

60 阅读1分钟

freysteinn-g-jonsson-s94zCnADcUs-unsplash.jpg 这是 leetcode 面试刷题一题多解系列的第17篇,看一道非常有意思的游戏题目:提莫攻击,对于钟爱提莫的你来说是不是so easy,这道题主要是考察对于时间的操作以及对于边界值的处理。

题目

提莫攻击

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

解法一:暴力法

我们可以考虑使用循环来遍历每次攻击,并判断攻击的开始时间和中毒持续时间是否在上一次攻击的中毒状态内,如果在就只需增加中毒时间,否则需要增加中毒持续时间。

时间复杂度:O(n),其中 n 是时间序列的长度。每个时间点至多只被遍历一次。

空间复杂度:O(1)。

var findPoisonedDuration = function(timeSeries, duration) {
    if (timeSeries.length == 0) return 0;
    let total = 0;
    for (let i = 0; i < timeSeries.length - 1; ++i)
        total += Math.min(timeSeries[i + 1] - timeSeries[i], duration);
    return total + duration;
};

解法二: 线性扫描

我们可以使用一个变量来记录当前中毒的结束时间,遍历每次攻击,并比较攻击开始时间和中毒结束时间的大小,来更新中毒结束时间和累加中毒时间。

时间复杂度:O(n),其中 n 是时间序列的长度。每个时间点至多只被遍历一次。

空间复杂度:O(1)。

var findPoisonedDuration = function(timeSeries, duration) {
  const n = timeSeries.length;
  if (n === 0) {
    return 0;
  }
  let total = 0;
  for (let i = 0; i < n - 1; ++i) {
    total += Math.min(timeSeries[i + 1] - timeSeries[i], duration);
  }
  return total + duration;
};

我的更多前端资讯

欢迎大家技术交流 资料分享 摸鱼 求助皆可 —链接