前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >米哈游(原神)一面算法原题

米哈游(原神)一面算法原题

作者头像
五分钟学算法
发布2024-04-19 19:46:06
840
发布2024-04-19 19:46:06
举报
文章被收录于专栏:五分钟学算法五分钟学算法

大家好,我是吴师兄。

继续今天的算法学习,来一个简单的算法题:提莫攻击

一、题目描述

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

当提莫攻击艾希,艾希的中毒状态正好持续 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 。

提示:

  • 1 <= timeSeries.length <= 104
  • 0 <= timeSeries[i], duration <= 107
  • timeSeries非递减 顺序排列

二、题目解析

算法思路:

  1. 初始化结果变量 ans 为 0,表示中毒状态持续的总时间。
  2. 初始化变量 expired 为 0,表示上次中毒状态结束的时间位置。
  3. 遍历时间序列 timeSeries:
    • 如果当前时间大于等于上次中毒状态结束的时间 expired,则表示又中毒了,此时直接累加中毒持续时间 duration 到结果变量 ans 中。
    • 否则,当前时间小于上次中毒状态结束的时间 expired,表示中毒状态不可叠加,需要计算当前中毒状态持续的时间,并将其累加到结果变量 ans 中。
  4. 更新上次中毒状态结束的时间位置 expired 为当前时间加上中毒持续时间 duration。
  5. 返回结果变量 ans。

代码解析:

  • 初始化结果变量 ans 为 0,表示中毒状态持续的总时间。
  • 初始化变量 expired 为 0,表示上次中毒状态结束的时间位置。
  • 遍历时间序列 timeSeries:
    • 如果当前时间大于等于上次中毒状态结束的时间 expired,则表示又中毒了,此时直接累加中毒持续时间 duration 到结果变量 ans 中。
    • 否则,当前时间小于上次中毒状态结束的时间 expired,表示中毒状态不可叠加,需要计算当前中毒状态持续的时间,并将其累加到结果变量 ans 中。
  • 更新上次中毒状态结束的时间位置 expired 为当前时间加上中毒持续时间 duration。
  • 返回结果变量 ans。

算法正确性证明:

  • 遍历时间序列 timeSeries,对于每个时间点:
    • 如果当前时间大于等于上次中毒状态结束的时间 expired,则表示又中毒了,直接累加中毒持续时间到结果变量中。
    • 否则,计算当前中毒状态持续的时间,并将其累加到结果变量中。
  • 最终结果变量 ans 即为中毒状态持续的总时间。

算法的优势:

  • 算法简单直观,只需一次遍历时间序列即可求解问题,时间复杂度较低。
  • 通过变量 expired 的维护,避免了重复计算中毒状态的持续时间,提高了效率。

算法的适用性:

  • 适用于解决求解中毒状态持续的总时间的问题,特别是对于按升序排列的时间序列的情况,此算法效率较高。

总结:本算法通过一次遍历时间序列,结合变量的维护,求解了中毒状态持续的总时间问题。算法简洁高效,适用于该类问题的求解。

三、参考代码

代码语言:javascript
复制
class Solution:
    def findPoisonedDuration(self, timeSeries: List[int], duration: int) -> int:

        # 结果变量
        ans = 0 

        # 每次中毒结束的时间位置
        expired = 0

        # 遍历数组 timeSeries
        for i in range(len(timeSeries)):

            # 1、如果发现当前的时间大于了最近一次中毒后得结束时间
            if timeSeries[i] >= expired:

                # 又中毒了,叠加时间
                ans += duration
            
            # 2、否则,如果发现当前的时间小于或者等于最近一次中毒后得结束时间
            else:
                # 由于中毒状态不可叠加
                # 新的中毒截止时间是 timeSeries[i] + duration
                # 上次中毒截止时间是 expired
                # 两者相减,获得持续中毒时间
                ans += timeSeries[i] + duration - expired

            # 更新中毒结束的时间位置
            expired = timeSeries[i] + duration
            
        # 返回结果
        return ans
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2024-04-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 五分钟学算法 微信公众号,前往查看

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

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、题目描述
  • 二、题目解析
  • 三、参考代码
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档