贪心
import java.util.Arrays;
class Solution {
public int candy(int[] ratings) {
/**
* 初始每个孩子一颗糖
*/
int[] res = new int[ratings.length];
Arrays.fill(res, 1);
/**
* 每个孩子都需要和自己左右的孩子进行比较来满足条件,但无法同时判断左右的大小
* 只能先从左到右遍历,使得每个孩子的右孩子都满足条件,只要右边比左边大,右边的糖果等于左边 + 1
* 然后从右到左遍历,使得每个孩子的左孩子满足条件,只要左边比右边大,左边的糖果应该取本身的糖果数(符合比它左边大) 和右边糖果数 + 1二者的最大值,这样才符合它比它左边的大,也比它右边大
*/
for (int i = 1; i < ratings.length; i++) {
if (ratings[i] > ratings[i - 1]){
res[i] = res[i - 1] + 1;
}
}
/**
* 因为右孩子已经满足条件了,在判断左孩子时,要取res[i + 1] + 1和res[i]的最大值,保证第i个小孩的糖果数量既大于左边也大于右边
*/
for (int i = ratings.length - 2; i >= 0; i--) {
if (ratings[i] > ratings[i + 1]){
res[i] = Math.max(res[i + 1] + 1, res[i]);
}
}
return Arrays.stream(res).sum();
}
}
/**
* 时间复杂度 O(n)
* 空间复杂度 O(1)
*/
https://leetcode-cn.com/problems/candy/