当前位置: 首页 > article >正文

Leetcode495. 提莫攻击

Every day a leetcode

题目来源:495. 提莫攻击

解法1:遍历

我们只需要对数组进行一次扫描就可以计算出总的中毒持续时间。我们记录艾希恢复为未中毒的起始时间 expired,设艾希遭遇第 i 次的攻击的时间为 timeSeries[i]。当艾希遭遇第 i 攻击时:

  • 如果当前他正处于未中毒状态,则此时他的中毒持续时间应增加 duration​,同时更新本次中毒结束时间 expired​ 等于 timeSeries[i] + duration​;
  • 如果当前他正处于中毒状态,由于中毒状态不可叠加,我们知道上次中毒后结束时间为 expired​​,本次中毒后结束时间 expired​ 为 timeSeries[i]+duration​​,因此本次中毒增加的持续中毒时间为timeSeries[i] - expired + duration;
  • 我们将每次中毒后增加的持续中毒时间相加即为总的持续中毒时间。

代码:

/*
 * @lc app=leetcode.cn id=495 lang=cpp
 *
 * [495] 提莫攻击
 */

// @lc code=start
class Solution
{
public:
    int findPoisonedDuration(vector<int> &timeSeries, int duration)
    {
        int sum = 0;
        int expired = 0; // 中毒结束时间
        int n = timeSeries.size();
        for (int i = 0; i < n; i++)
        {
            if (timeSeries[i] >= expired)
                sum += duration;
            else
                sum += timeSeries[i] - expired + duration;
            expired = timeSeries[i] + duration;
        }
        return sum;
    }
};
// @lc code=end

结果:

在这里插入图片描述

复杂度分析:

时间复杂度:O(n),其中 n 是数组 timeSeries 的长度。

空间复杂度:O(1)。

解法2:遍历

我们先将中毒时间设为最大值:timeSeries[timeSeries.size() - 1] + duration - 1。

再遍历数组,计算每两次提莫攻击间隔中未中毒的时间:timeSeries[i] - timeSeries[i - 1] - duration。

最后减去从第1秒到第一次攻击的间隔时间:timeSeries[0] - 1,即为答案。

代码:

/*
 * @lc app=leetcode.cn id=495 lang=cpp
 *
 * [495] 提莫攻击
 */

// @lc code=start
// class Solution
// {
// public:
//     int findPoisonedDuration(vector<int> &timeSeries, int duration)
//     {
//         int sum = 0;
//         int expired = 0; // 中毒结束时间
//         int n = timeSeries.size();
//         for (int i = 0; i < n; i++)
//         {
//             if (timeSeries[i] >= expired)
//                 sum += duration;
//             else
//                 sum += timeSeries[i] - expired + duration;
//             expired = timeSeries[i] + duration;
//         }
//         return sum;
//     }
// };

class Solution
{
public:
    int findPoisonedDuration(vector<int> &timeSeries, int duration)
    {
        int n = timeSeries.size();
        int sum = timeSeries[n - 1] + duration - 1;
        for (int i = n - 1; i > 0; i--)
        {
            if (timeSeries[i] - timeSeries[i - 1] > duration)
                sum -= timeSeries[i] - timeSeries[i - 1] - duration;
        }
        sum -= (timeSeries[0] - 1);
        return sum;
    }
};
// @lc code=end

结果:

在这里插入图片描述

复杂度分析:

时间复杂度:O(n),其中 n 是数组 timeSeries 的长度。

空间复杂度:O(1)。


http://www.kler.cn/a/17957.html

相关文章:

  • 【大数据学习 | flume】flume的概述与组件的介绍
  • Leecode热题100-35.搜索插入位置
  • SHELL脚本(Linux)
  • 实现 MVC 模式
  • 微服务架构面试内容整理-API 网关-Gateway
  • Android音频架构
  • 【键入网址到网页显示】
  • asp.net+sqlserver社区居民健康档案管理系统
  • InsCode体验报告
  • Axios概述
  • 冀永楠:OCR技术的应用与发展
  • Winform从入门到精通(36)——ColorDialog(史上最全)
  • 五音不全?手把手教你用自己声音唱任何歌;最详细的Auto-GPT整理;4月AI绘画模型推荐;HayoAI平台简直太酷了 | ShowMeAI日报
  • 错题本——数据库系统工程师 2022
  • 大家都去荷兰注册公司到底是为了什么?
  • MySQL数据库——MySQL修改和删除索引(DROP INDEX)
  • 后端程序员的前端必备【Vue】 - 07 ES6新语法
  • 测试20K要什么水平?25岁测试工程师成功斩下offer(附面试题)
  • 校园网自动登陆(河南科技学院)
  • cartographer源码阅读---位姿推测器
  • 榜单!直接式TPMS前装搭载率突破60%,哪些厂商在领跑
  • 2008-2020年上市公司能源消耗数据
  • MySQL知识学习06(SQL语句在MySQL中的执行过程)
  • 使用循环数组和环形链表实现双端队列
  • PVE 安装 windows10
  • 三十、组播技术——IGMP、IGMP-snooping、PIM-DM、PIM-SM