LeetCode算法日记 - Day 22: 提莫攻击、Z字形变换

目录

1. 提莫攻击

1.1 题目解析

1.2 解法

1.3 代码实现

2.  Z字形变换

2.1 题目解析

2.2 解法

2.3 代码实现


1. 提莫攻击

495. 提莫攻击 - 力扣(LeetCode)

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

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

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

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

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

示例 1:

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

示例 2:

输入: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.1 题目解析

这是一个典型的“区间累加问题”。提莫的攻击在时间线上形成若干连续或可能重叠的中毒区间,我们要统计这些区间覆盖的总长度。抽象后就是:给定若干非递减区间的起点和固定长度,求这些区间并集的总长度

常规解法

  • 直观想法是把每次攻击产生的区间 [timeSeries[i], timeSeries[i]+duration) 都存下来,然后合并重叠区间,再求总长度。

  • 时间复杂度最坏 O(n²)(如果每次都去遍历合并区间),空间复杂度 O(n) 或更多。

问题分析

  • 因为题目保证 timeSeries 已经非递减,重叠区间只会出现在相邻攻击之间。

  • 所以不不必存所有区间,只需要看相邻攻击的间隔 diff = timeSeries[i+1] - timeSeries[i]:

    • diff >= duration → 上一次中毒和下一次攻击不重叠,总长度加 duration

    • diff < duration → 重叠,总长度只加 diff

  • 这就把问题从“全局区间合并”简化为线性扫描相邻元素,O(n) 时间即可解决。

思路转折

  • 线性扫描每个攻击时间点,并根据与下一次攻击间隔计算贡献长度 → 高效且直观

  • 关键在于理解“重叠部分只计算一次”,所以用 min(diff, duration) 就可以准确累加。

1.2 解法

算法实现

  • 遍历每次攻击,统计它对中毒总秒数的贡献:

贡献=min⁡(下一次攻击间隔,duration)

  • 最后一发攻击必然完整贡献 duration。

i)初始化总中毒时间 total = 0

ii)遍历 timeSeries 的每个元素:

  • 对于第 i 次攻击,如果不是最后一次:total += min(timeSeries[i+1] - timeSeries[i], duration)

  • 对于最后一次攻击:total += duration

iii)返回 total

1.3 代码实现

class Solution {public int findPoisonedDuration(int[] timeSeries, int duration) {int n = timeSeries.length;if (n == 0) return 0;int total = 0;for (int i = 0; i < n - 1; i++) {total += Math.min(timeSeries[i + 1] - timeSeries[i], duration);}total += duration; // 最后一次攻击的完整中毒时间return total;}
}

复杂度分析

  • 时间复杂度:O(n),只遍历一次数组

  • 空间复杂度:O(1),只使用常量额外空间

2.  Z字形变换

6. Z 字形变换 - 力扣(LeetCode)

将一个给定字符串 s 根据给定的行数 numRows ,以从上往下、从左到右进行 Z 字形排列。

比如输入字符串为 "PAYPALISHIRING" 行数为 3 时,排列如下:

P   A   H   N
A P L S I I G
Y   I   R

之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:"PAHNAPLSIIGYIR"

请你实现这个将字符串进行指定行数变换的函数:

string convert(string s, int numRows);

示例 1:

输入:s = "PAYPALISHIRING", numRows = 3
输出:"PAHNAPLSIIGYIR"

示例 2:

输入:s = "PAYPALISHIRING", numRows = 4
输出:"PINALSIGYAHRPI"
解释:
P     I    N
A   L S  I G
Y A   H R
P     I

示例 3:

输入:s = "A", numRows = 1
输出:"A"

提示:

  • 1 <= s.length <= 1000
  • s 由英文字母(小写和大写)、',' 和 '.' 组成
  • 1 <= numRows <= 1000

2.1 题目解析

这是一个典型的“Z 字形字符串重排”问题,本质是按照规律将字符映射到不同的行,然后按行读取
抽象后可以看作:

  • 给定字符串 s

  • 给定行数 numRows

  • 将字符串按 Z 字形排列形成多行

  • 最终输出每行依次拼接后的结果

常规解法

  • 最直观的做法是构造一个二维数组 char[numRows][?],把每个字符放到对应行和列,然后按行读取。

  • 复杂度分析:

    • 时间:O(n) 遍历字符串

    • 空间:O(numRows * len_per_row) → 多余存储,尤其 numRows 接近 n 时

问题分析

  • 二维数组存储浪费空间

  • 规律可观察到:

    • 一个完整 Z 周期长度 = 2*numRows - 2

    • 第 0 行和最后一行:每周期只取一次字符

    • 中间行:每周期要取两次字符(竖直 + 斜向)

  • 因此无需显式二维存储,可以直接计算每行字符索引

思路转折

  • 线性扫描行号,每行按照周期公式取字符

  • 避免二维数组 → 节省空间

  • 核心在于理解周期长度和每行字符的索引规律

2.2 解法

  • Z 字形排列的规律可以用公式表示:

周期长度=d=2∗numRows−2

  • 每行字符索引:

    • 第一行:0, 0+d, 0+2d, ...

    • 中间行 i:竖直字符 j+i,斜向字符 j+d-i(j 为周期起点)

    • 最后一行:numRows-1, numRows-1+d, ...

i)处理特殊情况:numRows == 1 → 返回原字符串

ii)初始化 StringBuilder ret

iii)遍历第一行字符,按周期添加

iiii)遍历中间行:

  • 外层循环:行号 i = 1 → numRows-2

  • 内层循环:每个周期起点 j = 0, j+d, j+2d, ...

  • 对每个周期 append 两次字符:竖直和斜向(若未越界)

iiiii)遍历最后一行字符,按周期添加

iiiiii)返回 ret.toString()

2.3 代码实现

class Solution {public String convert(String s, int numRows) {int n = s.length();if(numRows == 1) return s; // 特殊情况StringBuilder ret = new StringBuilder();int d = 2*numRows - 2; // 周期长度// 第一行for(int i = 0; i < n; i += d){ret.append(s.charAt(i));}// 中间行for (int i = 1; i < numRows - 1; i++) {for (int j = 0; j + i < n; j += d) {ret.append(s.charAt(j + i));      // 竖直字符if (j + d - i < n) {              // 斜向字符ret.append(s.charAt(j + d - i));}}}// 最后一行for(int j = numRows - 1; j < n; j += d){ret.append(s.charAt(j));}return ret.toString();}
}

复杂度分析

  • 时间复杂度:O(n),每个字符访问一次

  • 空间复杂度:O(n),StringBuilder 存储最终结果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/920244.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/920244.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Unity笔记(七)——四元数、延迟函数、协同程序

写在前面&#xff1a;写本系列(自用)的目的是回顾已经学过的知识、记录新学习的知识或是记录心得理解&#xff0c;方便自己以后快速复习&#xff0c;减少遗忘。主要是C#代码部分。六、四元数欧拉角具有旋转约定&#xff0c;也就是说&#xff0c;无论你调整角度的顺序是什么&…

用大语言模型提升语音翻译:一种全新的端到端方法

用大语言模型提升语音翻译:一种全新的端到端方法 在语音翻译领域,如何将说话内容快速准确地转化为另一种语言,一直是研究者们关注的焦点。随着大语言模型(LLM)的兴起,我们迎来了一个全新的机遇:利用LLM的强大能力,来提升语音翻译系统的性能。最近,一项名为“End-to-E…

freeModbus TCP收发数据一段时间后,出现掉线情况(time out问题)

话说这个是真难找啊。我仅仅发表我找到的问题。我在接收几十到几百次数据的时候&#xff0c;会出现连接超时&#xff0c;也就是time out。而且ping也ping不通。也就是说明lwip出了问题。首先我先介绍modbus的这个流程。首先是函数eMBTCPInit( MB_TCP_PORT_USE_DEFAULT )我们进入…

Linux Web环境一键安装脚本集合(非docker)

✨重磅&#xff01;盹猫的个人小站正式上线啦&#xff5e;诚邀各位技术大佬前来探秘&#xff01;✨ —— 专为开发者打造的宝藏基地&#xff0c;等你来探索&#xff01; 这里有&#xff1a; &#x1f525; 硬核技术干货&#xff1a;编程技巧、开发经验、踩坑指南&#xff0c;带…

原生安卓#基于Android的爱好者分享论坛的设计与实现/基于Android在线论坛系统app/基于Android的论坛系统的设计与实现的设计与实现

原生安卓#基于Android的爱好者分享论坛的设计与实现/基于Android在线论坛系统app/基于Android的论坛系统的设计与实现的设计与实现

基于Android的超市购物系统的设计与实现、基于android的在线商城app/基于android的在线销售系统app#android

基于Android的超市购物系统的设计与实现、基于android的在线商城app/基于android的在线销售系统app#android

C++14 到 C++20 全面解析:语言新特性、标准库演进与实战案例

一、前言C 作为一门历史悠久且不断演进的编程语言&#xff0c;在 C11 之后进入了“现代化”的快车道。C11 被称为 C 的第二次诞生&#xff0c;引入了 lambda 表达式、智能指针、右值引用、并发支持等革命性特性。然而&#xff0c;C 的标准化进程并没有止步于此。C14、C17 和 C2…

HarvardX TinyML小笔记2(番外1:TFLite)

1 原理 tflite就是Tensorflow的轻量化模型&#xff0c;核心处理就是量化和剪枝。不过这部分目前是在Tensorflow中封装了&#xff0c;所以这里也不会去看细节&#xff0c;主要就是看看原理和使用方法。 量化Quantization&#xff0c;其实就是把原来的float32换成int8。这样一个…

向量库Qdrant vs Milvus 系统详细对比

Qdrant vs Milvus 系统详细对比 一、它们是什么&#xff08;定位&#xff09; 两者都是专门做向量相似搜索的数据库&#xff1a;支持ANN&#xff08;近似最近邻&#xff09;检索、向量结构化过滤、REST/gRPC 接口与官方SDK&#xff1b;Milvus 官方也定位为"面向GenAI、可…

适配欧拉操作系统

背景 客户指定服务器环境欧拉操作系统&#xff0c;版本&#xff1a;6.6.0-72.0.0.76.oe2403sp1.x86_64 需要把Java 应用以及各种中间件部署在欧拉操作系统上。 问题适配MySQL 1.1 编译报错 mysql-5.7.40-el7-x86_64.tar.gz版本在CentOS7环境安装正常 当前欧拉环境直接使用CentO…

学习spring Bean的生命周期

完整项目结构 ├── pom.xml └── src/├── main/│ ├── java/│ │ └── com/│ │ └── zhang/│ │ ├── bean/│ │ │ ├── Address.java│ │ │ ├── MyBeanPostProcessor.java│ │ …

elasticsearch 7.17.23 使用spring data es实现高亮分页,scroll查询分页查询

一 介绍 1.1 工程结构 1.2 启动elasticsearch服务 1.3 高亮分页 DeepSeek 代码 效果&#xff1a; 1.4 scroll分页 代码 2.效果 后台日志 1.5 完整代码 https://gitee.com/jurf-liu/es-2.17.x-demo.git

onlyoffice整合springboot+vue实现文档在线编辑保存

项目上需要用到在线word、excel文档编辑功能&#xff0c;通过游览器在线打开一个远程的word文档编辑保存&#xff0c;这里记录下整合思路。 onlyoffice简介 ONLYOFFICE 是一款开源的办公套件&#xff0c;提供了一系列在线文档编辑和协作工具&#xff0c;适用于团队和个人使用…

Linux笔记10——shell编程基础-4

补充$#——取参数个数“$n”,有值取值&#xff0c;无值取空字符&#xff0c;一般都会加引号&#xff0c;在某些情况下避免报语法错误一、read接收键盘输入[rootlocalhost ~]# cat demo.sh #!/bin/bash echo -n "请输入你的姓名&#xff1a;" read nameecho "你…

(Redis)过期删除策略

1. 背景Redis 支持为 Key 设置过期时间&#xff08;TTL&#xff09;&#xff0c;让数据在一定时间后自动失效。 例如&#xff1a;SET session:1001 "userA" EX 60 # 60 秒后过期但是问题来了&#xff1a;Key 到期后&#xff0c;Redis 什么时候、如何删除它&#xf…

nodejs 集成mongodb实现增删改查

初始化项目: npm init -y npm install mongoose -save 安装mongoose 插件 mongoose 链接数据库语法&#xff1a; mongodb://[username:password]host1[:poert1],host2[:port2]…/[databsase]?[options…] userame&#xff1a; 用户名 passwrod: 密码 host1:port1,host2:port…

音视频学习(五十八):STAP-A模式

什么是 STAP-A&#xff1f; STAP-A 是一种特殊的 RTP 封装机制&#xff0c;专为 H.264 和 H.265 这类视频编码协议设计。它的核心目的只有一个&#xff1a;将多个小的 NALU&#xff08;网络抽象层单元&#xff09;打包进一个 RTP 包中&#xff0c;以此来减少网络开销&#xff0…

管理型交换机通过VLAN划分实现不同IP跨网段通信配置方法

管理型交换机应用场景丰富&#xff0c;如果要实现不同IP跨网段通信(比如172.22.106.X和192.168.100.X实现通信)&#xff0c;通过VLAN划分是可以满足&#xff0c;下面分享基于弱三层交换机RTL9301方案核心模块SW-24G4F-301EM配置方法&#xff01; 1. 一般结合交换机的应用场景&a…

什么是高防服务器?如何进行防御?

高防服务器是指能为用户提供防御网络攻击&#xff0c;是主要针对DDOS等流量型攻击能力的服务器&#xff0c;通过部署专业的硬件设备与软件系统&#xff0c;具备高带宽、大流量清洗能力&#xff0c;能有效抵御各类恶意流量冲击&#xff0c;确保服务器稳定运行&#xff0c;保障网…

SW - 增加导出STL数据中的三角面数,增加别人逆向建模的难度

文章目录SW - 增加导出STL数据中的三角面数&#xff0c;增加别人逆向建模的难度概述笔记SW版本导出时&#xff0c;选择STL的导出选项默认导出(精细)导出粗糙自定义导出 - 将误差和角度改为最大自定义导出 - 将误差,角度,三角面数改为最大备注这几天的感想关于我不参考人家零件&…