【LeetCode】135.分发糖果
题目链接
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;
}
}