Leetcode 135 分發糖果 Hard

2022-09-22 20:48:17 字數 2452 閱讀 1930

題目概述:

分發糖果:

n 個孩子站成一排。給你乙個整數陣列 ratings 表示每個孩子的評分。

你需要按照以下要求,給這些孩子分發糖果:

每個孩子至少分配到 1 個糖果。

相鄰兩個孩子評分更高的孩子會獲得更多的糖果。

請你給每個孩子分發糖果,計算並返回需要準備的 最少糖果數目 。

思路:考慮需要調整的情況:

(1)左邊的孩子ratings比右邊高但是糖果不多於右邊的孩子

(2)左邊的孩子ratings比右邊低但是糖果不少於右邊的孩子

遇到需要調整的情形,如何調整:採用貪心演算法

(1)if  left_child_ratings > right_child_ratings  && left_child_candies <= right_child_candies:   left_child_candies = right_child_candies + 1

(2)if  left_child_ratings < right_child_ratings  && left_child_candies >= right_child_candies:   right_child_candies = left_child_candies + 1

具體策略:

設定乙個長度為2的視窗,先從左向右滑動,檢查並調整,再從右向左滑動, 檢查並調整。

演算法合理性的分析:

視窗從左向右滑動的過程,遇到 left_child_ratings < right_child_ratings  && left_child_candies >= right_child_candies 的情況, 調整,

視窗滑過去後,只可能增加這個right_child_candies, 此時仍滿足 left_child_ratings < right_child_ratings  && left_child_candies < right_child_candies ;

但是如果遇到left_child_ratings > right_child_ratings  && left_child_candies <= right_child_candies 的情況, 調整完,

視窗滑動過去後,可能又會增加 right_child_candies, 破壞之前滿足的 left_child_ratings > right_child_ratings  && left_child_candies > right_child_candies, 

此時我們需要, 當視窗從左向右滑到底後, 再將視窗從右向左滑到, 採取之前的調整方法

我最初的**:

class

solution

for (int i = ratings.size() - 1; i > 0; --i)

return

accumulate(candies.begin(), candies.end(), 0);}};

其實, 經過上述分析, **可以簡化

(1)在視窗從左向右滑動的過程, 只需考慮 left_child_ratings < right_child_ratings  && left_child_candies >= right_child_candies 的情況

滑過一輪後    left_child_ratings < right_child_ratings  -->   left_child_candies < right_child_candies

(2)視窗再從右向左滑動, 只需考慮 left_child_ratings > right_child_ratings  && left_child_candies <= right_child_candies 的情況

滑過一輪後    left_child_ratings > right_child_ratings  -->   left_child_candies > right_child_candies

且第二輪調整時不會破壞第一輪的調整結果, 因為每次調整, left_child_candies增加, 視窗滑動一次作為right_left_candies

如果left_child_ratings < right_child_ratings仍保持 left_child_candies < right_child_candies (因為right_child_candies相對第一輪只增不減)

簡化的**:

class

solution

for (int i = ratings.size() - 1; i > 0; --i)

return

accumulate(candies.begin(), candies.end(), 0);}};

本題思想簡單, 但實際上細節理解比較複雜。

核心是第二次遍歷如何才能在調整自己的基礎上維護第一次遍歷得到的結構

LeetCode 135 分發糖果

老師想給孩子們分發糖果,有 n 個孩子站成了一條直線,老師會根據每個孩子的表現,預先給他們評分。你需要按照以下要求,幫助老師給這些孩子分發糖果 每個孩子至少分配到 1 個糖果。相鄰的孩子中,評分高的孩子必須獲得更多的糖果。那麼這樣下來,老師至少需要準備多少顆糖果呢?示例 1 輸入 1,0,2 輸出 ...

leetcode135 分發糖果

一道很有意思的題目,難度級別為 困難。題目是這樣的的 老師想給孩子們分發糖果,有 n 個孩子站成了一條直線,老師會根據每個孩子的表現,預先給他們評分。你需要按照以下要求,幫助老師給這些孩子分發糖果 每個孩子至少分配到 1 個糖果。相鄰的孩子中,評分高的孩子必須獲得更多的糖果。那麼這樣下來,老師至少需...

leetcode135 分發糖果

老師想給孩子們分發糖果,有 n 個孩子站成了一條直線,老師會根據每個孩子的表現,預先給他們評分。你需要按照以下要求,幫助老師給這些孩子分發糖果 每個孩子至少分配到 1 個糖果。相鄰的孩子中,評分高的孩子必須獲得更多的糖果。那麼這樣下來,老師至少需要準備多少顆糖果呢?示例 1 輸入 1,0,2 輸出 ...