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