贪心算法解决分发糖果问题
代码随想录链接:代码随想录
思路:
由于每个孩子都要得到一块糖果,因此初始化一个全为1的数组,该数组的长度等于孩子的个数
从前往后遍历,如果位置i处的孩子对应的分数大于位置i-1处的孩子的分数,令该孩子获得的糖果数量为位置i-1处孩子获得的糖果数量+1
从后往前遍历数组中的每个元素,如果位置i处的孩子对应的分数大于位置i+1处的孩子的分数,令该孩子获得的糖果数量为位置i+1处孩子糖果数量+1和原先该孩子获得的糖果数量的最大值
两次遍历结束后,统计数组中的每个元素之和,即表示获得的最终结果
代码:
class Solution {
/**
分两个阶段
1、起点下标1 从左往右,只要 右边 比 左边 大,右边的糖果=左边 + 1
2、起点下标 ratings.length - 2 从右往左, 只要左边 比 右边 大,此时 左边的糖果应该 取本身的糖果数(符合比它左边大) 和 右边糖果数 + 1 二者的最大值,这样才符合 它比它左边的大,也比它右边大
*/
public int candy(int[] ratings) {
int len = ratings.length;
int[] candyVec = new int[len];
candyVec[0] = 1;
for (int i = 1; i < len; i++) {
candyVec[i] = (ratings[i] > ratings[i - 1]) ? candyVec[i - 1] + 1 : 1;
}
for (int i = len - 2; i >= 0; i--) {
if (ratings[i] > ratings[i + 1]) {
candyVec[i] = Math.max(candyVec[i], candyVec[i + 1] + 1);
}
}
int ans = 0;
for (int num : candyVec) {
ans += num;
}
return ans;
}
}