Leetcode之Teemo Attacking 问题

来源:互联网 发布:淘宝店更改主营类目 编辑:程序博客网 时间:2024/06/05 00:40

问题描述:

In LOL world, there is a hero called Teemo and his attacking can make his enemy Ashe be in poisoned condition. Now, given the Teemo's attackingascending time series towards Ashe and the poisoning time duration per Teemo's attacking, you need to output the total time that Ashe is in poisoned condition.

You may assume that Teemo attacks at the very beginning of a specific time point, and makes Ashe be in poisoned condition immediately.

Note:

  1. You may assume the length of given time series array won't exceed 10000.
  2. You may assume the numbers in the Teemo's attacking time series and his poisoning time duration per attacking are non-negative integers, which won't exceed 10,000,000.

示例一:

Input: [1,4], 2
Output: 4
Explanation: At time point 1, Teemo starts attacking Ashe and makes Ashe be poisoned immediately.
This poisoned status will last 2 seconds until the end of time point 2.
And at time point 4, Teemo attacks Ashe again, and causes Ashe to be in poisoned status for another 2 seconds.
So you finally need to output 4.

示例二:

Input: [1,2], 2
Output: 3
Explanation: At time point 1, Teemo starts attacking Ashe and makes Ashe be poisoned.
This poisoned status will last 2 seconds until the end of time point 2.
However, at the beginning of time point 2, Teemo attacks Ashe again who is already in poisoned status.
Since the poisoned status won't add up together, though the second poisoning attack will still work at time point 2, it will stop at the end of time point 3.
So you finally need to output 3.

问题来源:Teemo Attacking (详细地址:https://leetcode.com/problems/teemo-attacking/description/)

思路分析:题目那么一大片,吓死人啊都,但是题目的意思很简单,和Insert Interval 有点像,题目的意思就是数组中的每个元素表示每个时刻,然后后面的数字表示中毒持续的时间,最后求的是总共中毒的时间,题目我就不翻译了,在这拿两个例子解释下:

第一个例子:在第一分钟中毒,持续时间为2,所以可以持续到第三分钟,接着我们又在第四分钟施毒,又持续两分钟,这样就到第6分钟了,所以总共的中毒时间是4分钟。

第二个例子:在第一分钟中毒,本来是可以持续到第三分钟的,我在第二分钟再施一次毒,原来只可以到第三分钟的中毒时间,现在可以到第四分钟了,所以总共中毒时间为3分钟。

我们可以这样解答这道题:两个指针,一个为start,另外一个为end,如果新的时间片(是不是有点像Insert Interval中的那个new Interval?)的start大于正在执行的时间片的end,说明有交集,我们就更新它的end为新的值;相反,如果没有交集的话,我们就计算出上一段的时间片的大小,接着重新指定start和end指针。注意:记得最后还得把最后一次时间片的时间累加上。因为有重叠的时候计算的是上一次的时间片大小,而最后一次没有机会重叠了,所以记得加上!

代码:

复杂版:

简化版(其实也就是少写了一句代码):




原创粉丝点击