前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >leetcode495. 提莫攻击[easy](python/Rust)

leetcode495. 提莫攻击[easy](python/Rust)

原创
作者头像
从不摸鱼的van
发布2023-10-30 20:15:31
1140
发布2023-10-30 20:15:31
举报
文章被收录于专栏:van的取经之路van的取经之路

题目描述:

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

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

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

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

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

示例 1:

代码语言:javascript
复制
输入:timeSeries = [1,4], duration = 2
输出:4
解释:提莫攻击对艾希的影响如下:
- 第 1 秒,提莫攻击艾希并使其立即中毒。中毒状态会维持 2 秒,即第 1 秒和第 2 秒。
- 第 4 秒,提莫再次攻击艾希,艾希中毒状态又持续 2 秒,即第 4 秒和第 5 秒。
艾希在第 1、2、4、5 秒处于中毒状态,所以总中毒秒数是 4 。

示例 2:

代码语言:javascript
复制
输入:timeSeries = [1,2], duration = 2
输出:3
解释:提莫攻击对艾希的影响如下:
- 第 1 秒,提莫攻击艾希并使其立即中毒。中毒状态会维持 2 秒,即第 1 秒和第 2 秒。
- 第 2 秒,提莫再次攻击艾希,并重置中毒计时器,艾希中毒状态需要持续 2 秒,即第 2 秒和第 3 秒。
艾希在第 1、2、3 秒处于中毒状态,所以总中毒秒数是 3 。

思路:首先想到的是暴力法,枚举每个timeSeries里的元素,使用一个字典标记某一个点是否被访问到,最后累加被标记的值就是所解。

但这种算法时间复杂度很高,糟糕的情况下时间复杂度在O(n*n)。

代码语言:python
复制
class Solution:
    def findPoisonedDuration(self, timeSeries: List[int], duration: int) -> int:
        ans= 0
        ret = {}
        n = len(timeSeries)
        for i in range(n):
            for j in range(timeSeries[i],timeSeries[i]+duration):
                ret[j] = 1
        
        return sum(list(ret.values()))
            

只能通过一半测试用例
只能通过一半测试用例

所以改变思路:

既然要求中毒总秒数,那我们假设还要持续x秒,那么如果在第i秒,没有被攻击到,那么此时就会持续duration秒,如果这个时候已经被攻击到了,那么就会持续当前的时间+duration-x秒,每次攻击,已经持续的时间都是从攻击那次时间算的,所以要刷新x = 当前攻击时间+duration。

题解:

代码语言:python
复制
class Solution:
    def findPoisonedDuration(self, timeSeries: List[int], duration: int) -> int:
        ans,x= 0,0
        for mem in timeSeries:
            if mem >= x:
                ans += duration

            else:
                ans += mem + duration - x
            
            x = duration + mem
            
        return ans
            
python运行情况
python运行情况

Rsut 题解:

代码语言:rust
复制
impl Solution {
    pub fn find_poisoned_duration(time_series: Vec<i32>, duration: i32) -> i32 {
        let (mut ans,mut e) = (0i32,0i32);
        for member in time_series.iter(){
            if member >= &e{
                ans += duration;
            }else{
                ans += duration + member - e;
            }
            e = duration + member;
        } 
        ans
    }
}
rust运行情况
rust运行情况

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档