📢前言
🚀 算法题 🚀
🌲 每天打卡一道算法题,既是一个学习过程,又是一个分享的过程😜
🌲 提示:本专栏解题 编程语言一律使用 C# 和 Java 两种进行解题
🌲 要保持一个每天都在学习的状态,让我们一起努力成为算法大神吧🧐!
🌲 今天是力扣算法题持续打卡第60天🎈!
🚀 算法题 🚀
🌲原题样例:提莫攻击
在《英雄联盟》的世界中,有一个叫 “提莫” 的英雄,他的攻击可以让敌方英雄艾希(编者注:寒冰射手)进入中毒状态。
现在,给出提莫对艾希的攻击时间序列和提莫攻击的中毒持续时间,你需要输出艾希的中毒状态总时长。
你可以认为提莫在给定的时间点进行攻击,并立即使艾希处于中毒状态。
示例:
输入: [1,4], 2 输出: 4 原因: 第 1 秒初,提莫开始对艾希进行攻击并使其立即中毒。中毒状态会维持 2 秒钟,直到第 2 秒末结束。 第 4 秒初,提莫再次攻击艾希,使得艾希获得另外 2 秒中毒时间。 所以最终输出 4 秒。
示例 2:
输入: [1,2], 2 输出: 3 原因: 第 1 秒初,提莫开始对艾希进行攻击并使其立即中毒。中毒状态会维持 2 秒钟,直到第 2 秒末结束。 但是第 2 秒初,提莫再次攻击了已经处于中毒状态的艾希。 由于中毒状态不可叠加,提莫在第 2 秒初的这次攻击会在第 3 秒末结束。 所以最终输出 3 。
提示:
你可以假定时间序列数组的总长度不超过 10000。
你可以假定提莫攻击时间序列中的数字和提莫攻击的中毒持续时间都是非负整数,并且不超过 10,000,000。
🌻C#方法:一次遍历
如果两次攻击之间的间隔,小于duration,那么中毒状态刷新,间隔计入中毒事件
如果两次攻击之间的间隔,大于duration,那么说明之前中毒状态结束过一次了,将duration计入中毒时间
最后一次攻击后,不会再刷新了,,将duration计入中毒时间
代码:
public class Solution { public int FindPoisonedDuration(int[] timeSeries, int duration) { var n = timeSeries.Length; if (n == 0) return 0; var sum = 0; for (var i = 1; i < n ; ++i) sum += Math.Min(timeSeries[i] - timeSeries[i - 1], duration); return sum + duration; } }
执行结果
通过 执行用时:128 ms,在所有 C# 提交中击败了55.56%用户 内存消耗:48.6 MB,在所有 C# 提交中击败了20.00%的用户
🌻Java 方法:一次遍历
思路解析
代码:
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); return total + duration; } }
执行结果
通过 执行用时:2 ms,在所有 Java 提交中击败了91.69%的用户 内存消耗:40.1 MB,在所有 Java 提交中击败了66.64%的用户
复杂度分析
时间复杂度:O( n ) 空间复杂度:O( 1)
总结
- 今天是力扣算法题打卡的第六十天!
- 文章采用
C#
和Java
两种编程语言进行解题 - 一些方法也是参考力扣大神写的,也是边学习边分享,再次感谢算法大佬们
- 那今天的算法题分享到此结束啦,明天再见!