目錄
一、題目描述
二、解題思路
三、**實現
老師想給孩子們分發糖果,有 n 個孩子站成了一條直線,老師會根據每個孩子的表現,預先給他們評分。
你需要按照以下要求,幫助老師給這些孩子分發糖果:
那麼這樣下來,老師至少需要準備多少顆糖果呢?
示例 1:
輸入:[1,0,2]示例 2:輸出:5
解釋:你可以分別給這三個孩子分發 2、1、2 顆糖果。
輸入:[1,2,2]這道題一開始直覺就是模擬,初始每人一顆,然後根據左邊與右邊的情況來增加數量;增加的策略是只有比左邊多才加一,比右邊多也加一,所有這題是貪心演算法。輸出:4
解釋:你可以分別給這三個孩子分發 1、2、1 顆糖果。
第三個孩子只得到 1 顆糖果,這已滿足上述兩個條件。
區域性最優是比左邊多加一,比右邊多也加一;全域性最優是糖果數最少;區域性最優可以得到全域性最優。
細節:
如果一遍遍歷中對左右兩邊去操作,得到的結果不一定對。比如ratings=,得到的糖果情況會是candies=,而正確的結果是candies=。
這是因為在計算第三個6(ratings[4])時,6(ratings[4])不比左邊6(ratings[3])大,糖果數不加一;比右邊2(ratings[5])大,糖果數加一得到2。
錯誤的點在於右邊的2(ratings[5])的糖果數並不正確,因為他比他右邊的1(ratings[6])大,6的糖果數應該在2的糖果數的基礎上加一,才能得到正確的結果。
正確的做法是:兩邊遍歷(先從左往右,在從右往左,調換順序也一樣)
#include using namespace std;
int candy(vector& ratings)
} for (int j = length - 1; j >= 0; j--)
} int res = 0;
for (int i = 0; i < length; i++)
return res;
}int main() ;
cout << candy(ratings);
return 0;
}
LeetCode 135 分發糖果
老師想給孩子們分發糖果,有 n 個孩子站成了一條直線,老師會根據每個孩子的表現,預先給他們評分。你需要按照以下要求,幫助老師給這些孩子分發糖果 每個孩子至少分配到 1 個糖果。相鄰的孩子中,評分高的孩子必須獲得更多的糖果。那麼這樣下來,老師至少需要準備多少顆糖果呢?示例 1 輸入 1,0,2 輸出 ...
leetcode135 分發糖果
一道很有意思的題目,難度級別為 困難。題目是這樣的的 老師想給孩子們分發糖果,有 n 個孩子站成了一條直線,老師會根據每個孩子的表現,預先給他們評分。你需要按照以下要求,幫助老師給這些孩子分發糖果 每個孩子至少分配到 1 個糖果。相鄰的孩子中,評分高的孩子必須獲得更多的糖果。那麼這樣下來,老師至少需...
leetcode135 分發糖果
老師想給孩子們分發糖果,有 n 個孩子站成了一條直線,老師會根據每個孩子的表現,預先給他們評分。你需要按照以下要求,幫助老師給這些孩子分發糖果 每個孩子至少分配到 1 個糖果。相鄰的孩子中,評分高的孩子必須獲得更多的糖果。那麼這樣下來,老師至少需要準備多少顆糖果呢?示例 1 輸入 1,0,2 輸出 ...