題目
n 個孩子站成一排。給你一個整數數組 ratings 表示每個孩子的評分。
你需要按照以下要求,給這些孩子分發糖果:
每個孩子至少分配到 1 個糖果。
相鄰兩個孩子評分更高的孩子會獲得更多的糖果。
請你給每個孩子分發糖果,計算并返回需要準備的 最少糖果數目 。
示例 1:
輸入:ratings = [1,0,2]
輸出:5
解釋:你可以分別給第一個、第二個、第三個孩子分發 2、1、2 顆糖果。
示例 2:
輸入:ratings = [1,2,2]
輸出:4
解釋:你可以分別給第一個、第二個、第三個孩子分發 1、2、1 顆糖果。
第三個孩子只得到 1 顆糖果,這滿足題面中的兩個條件。
解題思路
首先,從左往右遍歷整個評分數組,如果當前孩子的評分比前一個孩子高,那么他的糖果數應該比前一個孩子多一個。這樣可以確保相鄰兩個孩子中評分更高的孩子獲得更多的糖果。
然后,從右往左遍歷整個評分數組,如果當前孩子的評分比后一個孩子高,并且他當前擁有的糖果數不多于后一個孩子,那么他的糖果數應該比后一個孩子多一個。這樣可以確保相鄰兩個孩子中評分更高的孩子獲得更多的糖果。
最后,計算所有孩子擁有的糖果總數,即為所需準備的最少糖果數目。
代碼實現
class Solution {
public:int candy(vector<int>& ratings) {int n = ratings.size();vector<int> candies(n, 1); // 初始化每個孩子至少分配到1個糖果// 從左往右遍歷,確保右邊評分更高的孩子獲得更多的糖果for (int i = 1; i < n; i++) {if (ratings[i] > ratings[i - 1]) {candies[i] = candies[i - 1] + 1;}}// 從右往左遍歷,確保左邊評分更高的孩子獲得更多的糖果for (int i = n - 2; i >= 0; i--) {if (ratings[i] > ratings[i + 1]) {candies[i] = max(candies[i], candies[i + 1] + 1);}}// 計算總糖果數int totalCandies = accumulate(candies.begin(), candies.end(), 0);return totalCandies;}
};