151
社区成员
发帖
与我相关
我的任务
分享在《英雄联盟》的世界中,有一个叫 “提莫” 的英雄,他的攻击可以让敌方英雄艾希进入中毒状态。
现在,给出提莫对艾希的攻击时间序列和提莫攻击的中毒持续时间,你需要输出艾希的总中毒时间。
示例 1:
plaintext
输入: timeSeries = [1,4], duration = 2
输出: 4
解释:
第 1 秒,提莫攻击艾希并使其立即中毒,中毒状态会持续 2 秒,即第 1、2 秒。
第 4 秒,提莫再次攻击艾希,中毒状态又持续 2 秒,即第 4、5 秒。
总中毒时间为 2 + 2 = 4。
示例 2:
plaintext
输入: timeSeries = [1,2], duration = 2
输出: 3
解释:
第 1 秒,提莫攻击艾希并使其立即中毒,中毒状态会持续 2 秒,即第 1、2 秒。
第 2 秒,提莫再次攻击艾希,此时艾希还在中毒中,中毒时间会被重置为 2 秒,即第 2、3 秒。
总中毒时间为 3。
提示:
timeSeries 是一个非递减序列timeSeries.length <= 10^4timeSeries[i], duration 是非负整数,且不会超过 107这道题本质是区间合并问题:
[timeSeries[i], timeSeries[i] + duration - 1]一句话总结:重叠取间隔,不重叠取完整,最后补最后一次攻击!
java
运行
class Solution {
public int findPoisonedDuration(int[] timeSeries, int duration) {
// 边界情况:没有攻击,中毒时间为 0
if (timeSeries.length == 0) {
return 0;
}
// 记录总中毒时间
int total = 0;
// 从第二次攻击开始遍历,和前一次攻击比较
for (int i = 1; i < timeSeries.length; i++) {
// 上一次攻击的中毒结束时间
int prevEnd = timeSeries[i - 1] + duration - 1;
// 当前攻击的开始时间
int currStart = timeSeries[i];
if (currStart <= prevEnd) {
// 中毒时间重叠:只累加两次攻击的间隔
total += currStart - timeSeries[i - 1];
} else {
// 中毒时间不重叠:累加完整的中毒时长
total += duration;
}
}
// 最后一次攻击一定是完整中毒时长,必须单独加上
total += duration;
return total;
}
}
currStart <= prevEnd → 只加时间差(因为中毒被重置了)java
运行
public class Main {
public static void main(String[] args) {
Solution solution = new Solution();
// 测试用例 1
int[] timeSeries1 = {1, 4};
System.out.println(solution.findPoisonedDuration(timeSeries1, 2)); // 输出 4
// 测试用例 2
int[] timeSeries2 = {1, 2};
System.out.println(solution.findPoisonedDuration(timeSeries2, 2)); // 输出 3
}
}
这道题是贪心算法的入门经典题,核心就是判断区间是否重叠,掌握这个思路,同类区间合并题目都能轻松拿下!
这道题有很多解法