leetCode134 分發糖果

2021-10-12 17:54:16 字數 1353 閱讀 9356

目錄

一、題目描述

二、解題思路

三、**實現

老師想給孩子們分發糖果,有 n 個孩子站成了一條直線,老師會根據每個孩子的表現,預先給他們評分。

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

那麼這樣下來,老師至少需要準備多少顆糖果呢?

示例 1:

輸入:[1,0,2]

輸出:5

解釋:你可以分別給這三個孩子分發 2、1、2 顆糖果。

示例 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 輸出 ...