【优选算法】(第二十篇)

news/2024/10/4 15:27:52 标签: 算法, 数据结构, java, c++, leetcode, vscode

目录

提莫攻击(easy)

题目解析

讲解算法原理

编写代码

N字形变换(medium)

题目解析

讲解算法原理

编写代码


提莫攻击(easy)

题目解析

1.题目链接:. - 力扣(LeetCode)

2.题目描述

在《英雄联盟》的世界中,有⼀个叫“提莫”的英雄。他的攻击可以让敌⽅英雄艾希(编者注:寒冰射⼿)进⼊中毒状态。
当提莫攻击艾希,艾希的中毒状态正好持续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<=10^4
0<=timeSeries[i],duration<=10^7
timeSeries按⾮递减顺序排列

讲解算法原理

解法(模拟+分情况讨论):
算法思路:
模拟+分情况讨论。
计算相邻两个时间点的差值:
i. 如果差值⼤于等于中毒时间,说明上次中毒可以持续 duration 秒;

ii. 如果差值⼩于中毒时间,那么上次的中毒只能持续两者的差值。

编写代码

c++算法代码:

class Solution {
public:
 int findPoisonedDuration(vector<int>& timeSeries, int duration) {
 int ret = 0;
 for(int i = 1; i < timeSeries.size(); i++)
 {
 int tmp = timeSeries[i] - timeSeries[i - 1];
 if(tmp >= duration) ret += duration;
 else ret += tmp;
 }
 return ret + duration;
 }
};

java算法代码:

class Solution {
 public int findPoisonedDuration(int[] timeSeries, int duration) {
 int ret = 0;
 for(int i = 1; i < timeSeries.length; i++) {
 int x = timeSeries[i] - timeSeries[i - 1];
 if(x >= duration) ret += duration;
 else ret += x;
 }
 return ret + duration;
 }
}

N字形变换(medium)

题目解析

1.题目链接:. - 力扣(LeetCode)

2.题目描述

将⼀个给定字符串s根据给定的⾏数numRows,以从上往下、从左到右进⾏Z字形排列。⽐如输⼊字符串为"PAYPALISHIRING"⾏数为3时,排列如下:
PAHN
APLSIIG
YIR
之后,你的输出需要从左往右逐⾏读取,产⽣出⼀个新的字符串,⽐如:"PAHNAPLSIIGYIR"。请你实现这个将字符串进⾏指定⾏数变换的函数:
stringconvert(strings,intnumRows);
⽰例1:输⼊:s="PAYPALISHIRING",numRows=3输出:"PAHNAPLSIIGYIR"
⽰例2:输⼊:s="PAYPALISHIRING",numRows=4输出:"PINALSIGYAHRPI"
解释:PINALSIGYAHR
PI
⽰例3:
输⼊:s="A",numRows=1
输出:"A"

提⽰:
1<=s.length<=1000
s由英⽂字⺟(⼩写和⼤写)、','和'.'组成
1<=numRows<=1000

讲解算法原理

解法(模拟+找规律):
算法思路:
找规律,⽤row代替⾏数,row=4时画出的N字形如下:02row-24row-4
12row-32row-14row-54row-3
22row-42row4row-64row-2
32row+14row-1
不难发现,数据是以2row-2为⼀个周期进⾏规律变换的。将所有数替换成⽤周期来表⽰的变量:第⼀⾏的数是:0,2row-2,4row-4;
第⼆⾏的数是:1,(2row-2)-1,(2row-2)+1,(4row-4)-1,(4row-4)+1;第三⾏的数是:2,(2row-2)-2,(2row-2)+2,(4row-4)-2,(4row-4)+2;第四⾏的数是:3,(2row-2)+3,(4row-4)+3。
可以观察到,第⼀⾏、第四⾏为差为2row-2的等差数列;第⼆⾏、第三⾏除了第⼀个数取值为⾏数,每组下标为(2n-1,2n)的数围绕(2row-2)的倍数左右取值。
以此规律,我们可以写出迭代算法

编写代码

c++算法代码:

class Solution
{
public:
 string convert(string s, int numRows) 
 {
 // 处理边界情况
 if(numRows == 1) return s;
 
 string ret;
 int d = 2 * numRows - 2, n = s.size();
 
 // 1. 先处理第⼀⾏
 for(int i = 0; i < n; i += d)
 ret += s[i];
 
 // 2. 处理中间⾏
 for(int k = 1; k < numRows - 1; k++) // 枚举每⼀⾏
 {
 for(int i = k, j = d - k; i < n || j < n; i += d, j += d)
 {
 if(i < n) ret += s[i];
 if(j < n) ret += s[j];
 }
 }
 
 // 3. 处理最后⼀⾏
 for(int i = numRows - 1; i < n; i += d)
 ret += s[i];
 return ret;
 }
};

java算法代码:

class Solution
{
 public String convert(String s, int numRows) 
 {
 // 处理⼀下边界情况
 if(numRows == 1) return s;
 int d = 2 * numRows - 2, n = s.length();
 StringBuilder ret = new StringBuilder();
 // 1. 处理第⼀⾏
 for(int i = 0; i < n; i += d)
 ret.append(s.charAt(i));
 // 2. 处理中间⾏
 for(int k = 1; k < numRows - 1; k++) // 依次枚举中间⾏
 {
 for(int i = k, j = d - i; i < n || j < n; i += d, j += d)
 {
 if(i < n) ret.append(s.charAt(i));
 if(j < n) ret.append(s.charAt(j));
 }
 }
 
 // 3. 处理最后⼀⾏
 for(int i = numRows - 1; i < n; i += d)
 ret.append(s.charAt(i));
 return ret.toString();
 }
}


http://www.niftyadmin.cn/n/5690079.html

相关文章

程序猿成长之路之设计模式篇——设计模式简介

无论是对于代码质量还是代码可维护性、可扩展性&#xff0c;使用合适的设计模式都能够起到促进提升的作用&#xff0c;此外在软考的软件工程师、系统架构师职称考试中&#xff0c;设计模式也是必考的一块内容&#xff0c;因此我打算开拓一个新的专栏简单介绍一下设计模式&#…

查缺补漏----I/O中断处理过程

中断优先级包括响应优先级和处理优先级&#xff0c;响应优先级由硬件线路或查询程序的查询顺序决定&#xff0c;不可动态改变。处理优先级可利用中断屏蔽技术动态调整&#xff0c;以实现多重中断。下面来看他们如何运用在中断处理过程中&#xff1a; 中断控制器位于CPU和外设之…

27 基于51单片机的方向盘模拟系统

目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 基于STC89C52单片机&#xff0c;采用两个MPX4115压力传感器作为两路压力到位开关电路&#xff0c; 采用滑动变阻器连接数模转换器模拟重力加速度传感器电路&#xff1b; 一个按键控制LED灯的点亮与…

取反与while错误,while卡死,非成功不结束思想总结

一般我们写函数配置硬件&#xff0c;都需要返回它的成功与否。我们以成功为一&#xff0c;不成功为零&#xff0c;借助这两个变量&#xff0c;我们就可以设计一个死循环&#xff0c;让它不成功不结束的思想 while&#xff08;1&#xff09;{if&#xff08; open&#xff08;&a…

ARM嵌入式学习--第一天

-ARM核介绍 -CPU核 CPU又叫中央处理器&#xff0c;其主要功能是进行算数运算和逻辑运算&#xff0c;内部结构大概可以分为控制单元&#xff0c;算术逻辑单元和储存单元等几个部分 -ARM核 工作模式&#xff1a; user mode:用户模式是用户程序的工作模式&#xff0c;他运行在操作…

防范.[support2022@cock.li].colony96勒索病毒:数据保护、恢复与安全意识提升

导言 在数字世界的暗流涌动中&#xff0c;.[support2022cock.li].colony96勒索病毒以其独特的智能监控技术和狡猾的传播策略&#xff0c;悄然成为网络安全领域的一颗“定时炸弹”。本文旨在深入剖析这一新型勒索病毒的运作机制&#xff0c;探索创新的数据恢复方法&#xff0c;…

数据仓库!企业决策的智慧引擎

数据仓库&#xff01;企业决策的智慧引擎 前言数据仓库 前言 今数字化浪潮汹涌澎湃的时代&#xff0c;数据已然成为企业航行于市场海洋的罗盘&#xff0c;而数据仓库则是那承载罗盘的坚固船只。当我们深入探究数据仓库的世界&#xff0c;就仿佛打开了一扇通往企业智慧核心的大…

关于Fake Location定位,运动世界校园问题

不好意思&#xff0c;之前那个文章其实是很早之前的&#xff0c;不知道为什么审核了很久一直没有通过&#xff0c;然后前几周莫名其妙点了一下重新发布&#xff0c;竟然发布成功了&#xff0c;这个方法已经失效了&#xff0c;要可以稳定&#xff0c;我建议是买一台root的手机&a…