class Solution {
public int candy(int[] ratings) {
int len = ratings.length;
int[] arr = new int[len];
arr[0] = 1;
// 从左向右比较,只要是右边的大,右边的为左边的加一1,否则就为1
for(int i=1; i<len; i++){
arr[i] = (ratings[i] > ratings[i-1]) ? arr[i-1]+1 : 1;
}
// 从右向左比较,只要是左边的大,左边的就为arr[i](从左到右计算的结果),与arr[i+1]+1的最大值
for(int j=len-2; j>=0; j--){
if(ratings[j] > ratings[j+1]){
arr[j] = Math.max(arr[j],arr[j+1]+1);
}
}
int sum = 0;
for(int i=0; i<len; i++){
sum += arr[i];
}
return sum;
}
}
用到两次贪心
一次是从左到右遍历,只比较右边孩子评分比左边大的情况。
一次是从右到左遍历,只比较左边孩子评分比右边大的情况。
当从右到左遍历时,如果左边孩子评分大,此时就要考虑到左边孩子既比他左边的孩子评分高,又比他右边孩子评分高的情况。