方法一: 貪心演算法+兩次遍歷
解題思路:
* 規則定義: 設學生 a 和學生 b 左右相鄰,a 在 bb左邊;
* 左規則: 當 ratings_b>ratingsa時,b 的糖比 a 的糖數量多
* 右規則: 當 ratings_a>ratingsb時,aa的糖比 b 的糖數量多。
步驟:先給所有的學生一顆糖
從左往右遍歷陣列,如果右邊比左邊評分高,則左邊糖果=右邊糖果數+1
從右往左遍歷,如果左邊比相鄰右邊評分高,並且右邊的糖果數多餘左邊的 糖果數,則左邊的糖果數=右邊糖果數+1,並對其糖果數累加
返回結果值
int
candy
(vector<
int>
& ratings)
for(
int i=ratings.
size()
-2;i>=
0;i--
) result+
=res[0]
;return result;
}優化:
intcandy
(vector<
int>
& ratings)
else
}int right =
0, ret =0;
//定義乙個變數,用於記錄從右往左變化時 糖果數量的變化
for(
int i = n -
1; i >=
0; i--
)else
ret +
=max
(left[i]
, right);}
return ret;
}
方法二:常數空間遍歷
思路:從左往後開始列舉每個同學,記前乙個同學分得的糖果數量為pre
如果當前同學比上乙個同學評分高,說明我們就在最近的遞增序列中,直接分配給該同學 \textit + 1pre+1
個糖果即可
否則我們就在乙個遞減序列中,我們直接分配給當前同學乙個糖果,並把該同學所在的遞減序列中所有的同學都再多分配乙個糖果,以保證糖果數量還是滿足條件。
我們只要記錄當前遞減序列的長度 dec,最近的遞增序列的長度 inc 和前乙個同學分得的糖果數量pre 即可
注意:一定要考慮相同的數連續出現的情況
int
candy
(vector<
int>
& ratings)
else
}return result;
}
LeetCode 135 分發糖果
老師想給孩子們分發糖果,有 n 個孩子站成了一條直線,老師會根據每個孩子的表現,預先給他們評分。你需要按照以下要求,幫助老師給這些孩子分發糖果 每個孩子至少分配到 1 個糖果。相鄰的孩子中,評分高的孩子必須獲得更多的糖果。那麼這樣下來,老師至少需要準備多少顆糖果呢?示例 1 輸入 1,0,2 輸出 ...
leetcode135 分發糖果
一道很有意思的題目,難度級別為 困難。題目是這樣的的 老師想給孩子們分發糖果,有 n 個孩子站成了一條直線,老師會根據每個孩子的表現,預先給他們評分。你需要按照以下要求,幫助老師給這些孩子分發糖果 每個孩子至少分配到 1 個糖果。相鄰的孩子中,評分高的孩子必須獲得更多的糖果。那麼這樣下來,老師至少需...
leetcode135 分發糖果
老師想給孩子們分發糖果,有 n 個孩子站成了一條直線,老師會根據每個孩子的表現,預先給他們評分。你需要按照以下要求,幫助老師給這些孩子分發糖果 每個孩子至少分配到 1 個糖果。相鄰的孩子中,評分高的孩子必須獲得更多的糖果。那麼這樣下來,老師至少需要準備多少顆糖果呢?示例 1 輸入 1,0,2 輸出 ...