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)。