題目鏈接
135. 分發糖果
題目描述
解題思路
貪心法
兩次貪心:從左到右進行貪心選擇,從右到左進行貪心選擇
題目中說到:相鄰的孩子中,評分高的孩子必須獲得更多的糖果。這裏的相鄰包含兩種情況:左相鄰和右相鄰,我們不能一次性把左相鄰和右相鄰通通考慮,這樣只會得不償失,我們採取的策略是分兩次考慮,所以可以把總的規則分爲左相鄰規則和右相鄰規則,只要同時滿足左相鄰規則和右相鄰規則,那就滿足了題目要求。
初始所有孩子的糖果數都爲1.
左相鄰規則:從左到右遍歷,if(rate[i] > rate[i-1]),索引爲i的孩子的糖果數目比索引爲i-1的孩子的糖果數+1,並用left數組記錄
右相鄰規則:從右到左遍歷,if(rate[i] > rate[i+1]),索引爲i的孩子的糖果數目比索引爲i+1的孩子的糖果數+1,並用right數組記錄
如何既滿足左相鄰又滿足右相鄰規則呢?
最終索引爲i的孩子擁有的糖果數目=Math.max(left[i],righy[i])
AC代碼
class Solution {
public int candy(int[] ratings) {
int left[] = new int[ratings.length];
int right[] = new int[ratings.length];
Arrays.fill(left,1);
Arrays.fill(right,1);
int ans = 0;
for(int i = 1; i < ratings.length; i++){
if(ratings[i] > ratings[i-1]) left[i] = left[i-1] + 1;
}
for(int i = ratings.length-2; i >= 0; i--){
if(ratings[i] > ratings[i+1]) right[i] = right[i+1] + 1;
}
for(int i = 0; i < ratings.length; i++){
ans += Math.max(left[i],right[i]);
}
return ans;
}
}