1. 程式人生 > 其它 >495_提莫攻擊_2021.11.10

495_提莫攻擊_2021.11.10

在《英雄聯盟》的世界中,有一個叫 “提莫” 的英雄。他的攻擊可以讓敵方英雄艾希(編者注:寒冰射手)進入中毒狀態。

當提莫攻擊艾希,艾希的中毒狀態正好持續duration 秒。

正式地講,提莫在 t 發起發起攻擊意味著艾希在時間區間 [t, t + duration - 1](含 t 和 t + duration - 1)處於中毒狀態。如果提莫在中毒影響結束 前 再次攻擊,中毒狀態計時器將會 重置 ,在新的攻擊之後,中毒影響將會在 duration 秒後結束。

給你一個 非遞減 的整數陣列 timeSeries ,其中 timeSeries[i] 表示提莫在 timeSeries[i] 秒時對艾希發起攻擊,以及一個表示中毒持續時間的整數 duration 。

返回艾希處於中毒狀態的 總 秒數。

自己的程式碼,最初版本:

class Solution {
public:
    int findPoisonedDuration(vector<int>& timeSeries, int duration) {

        int result = 0;

        for (auto i = timeSeries.begin(); i != (timeSeries.end()-1); i++)
        {

            int temp = (*i) + duration;
            
if (temp > (*(i + 1))) { result += (*(i + 1)) - (*i); } else { result += duration; } } return result + duration; } };

經過室友提示後用到min函式的簡化版本:

 1 class Solution {
 2 public:
 3     int findPoisonedDuration(vector<int
>& timeSeries, int duration) { 4 5 int result = 0; 6 7 for (auto i = timeSeries.begin(); i != (timeSeries.end()-1); i++) 8 { 9 result += min(duration, (*(i + 1) - (*i))); 10 } 11 12 return result + duration; 13 14 } 15 };

研究了一會兒,還是最終看不懂的超簡化一行版本(本來想用for_each實現,但是發現for_each只能遍歷當前的元素):

①用到了accumulate迭代累加函式,這個函式的功能是用來累加容器中的值。

②用到了Lambda表示式,看不懂

③用到了自定型別pair,也沒看太懂

有懂的大佬幫忙解釋一下

int findPoisonedDuration(vector<int>& timeSeries, int duration) {
        return accumulate(timeSeries.begin(), timeSeries.end(), make_pair(timeSeries[0], duration), 
                [&](pair<int, int> acc, int t){ return make_pair(t, acc.second + min(t - acc.first, duration)); }).second; }

梳理了一下:

作者是構建了一個拿Key儲存上一次數值,拿Value儲存當前計算後的最小值的元素。每次會取到timeSeries的元素。

拿timeSeries={1,2,3,4,5,6,7,8,9},duration=5來說:

①初始化:pair<1, 5>

②開始記錄元素:t = 2, pair<2, 5 + min((2 - 1), 5)>

。。。

最後一次:t=9 pair<9, 5 + 8> 其中8代表每次累加過程中,取到的min(1, 5),一共取了8次。