没做出来
官解1: 两次循环分别求i左右侧糖果数量限制,取二者最大值。
java
class Solution {
public int candy(int[] ratings) {
int n = ratings.length;
int[] left = new int[n];
// i左侧的糖果数需要满足的要求:保证满足上升趋势需求
for(int i=0; i<n;i++){
if(i>0 && ratings[i] > ratings[i-1]){
left[i] = left[i-1] + 1;
}else{
left[i] = 1;
}
}
// i右侧的糖果数需要满足的要求:保证满足下降趋势需求
// 例如 3、2、1 那么为了保证1最小糖果为1-->对应的元素为1,那么2-->最小是2,3--->3.
int right = 0, res = 0;
for(int i=n-1;i>=0;i--){
if(i < n-1 && ratings[i] > ratings[i+1] ){
right++;
}else{
right = 1;
}
res += Math.max(right, left[i]);
// 左右糖果的限制,取二者的最大值:保证同时满足二者的要求
}
return res;
}
}
常量空间解法
解释一下这里为什么要 res++:考虑一下这个样例: 1 3 2 1:
如果不加1的话,按照这个代码: 糖果是:1 2 1 2 但是很明显321的话 3对应的人应该最少分3个糖果,这就会出现错误。
if(down >= up){
res++;
}
java
class Solution {
public int candy(int[] ratings) {
int n = ratings.length;
int res = 1;
// 默认第一个元素为上升序列
int cur = 1; // 记录上升过程中的,应该最少的糖果数
int up = 1; // 记录上升趋势
int down = 0; // 记录下降趋势
for(int i=1;i<n;i++){
if(ratings[i]> ratings[i-1]){
// 上升序列
down = 0;
cur++;
up = cur;
res += cur;
}else if(ratings[i] == ratings[i-1]){
down = 0;
cur = 1;
up = 1;
res += 1;
}else{
down ++;
cur = 1;
res += down;
if(down >= up){
res++;
}
}
}
return res;
}
}