思路:刚开始想的时候有贪心的味道,后来在做出来之后,哦,就是贪心!
题目要求我们按照规则分发糖果并且要让糖果的数量最少。
那么我们可以首先构造一个数组和原数组的长度匹配,记录每一个小朋友获得的糖果。
1.题目中明确说了至少每一个小朋友都会有一个糖果,所以初始化数组的元素都为1;
2.又说了我们每相邻的小朋友中,评分高的获得糖果会多一点。比如[1,0],这样的话就是第一个小朋友获得糖果多。因为一开始都是1,并且我们需要最少的糖果数,所以第一个小朋友的糖果数就是2了(比相邻的多1个)。初步的贪心我们就得出来了,相邻之间得分高的糖果数多1.
3.如果原数组的序列是升序的,那么也就是cnt[i]=cnt[i-1]+1,这样得出每个小朋友的糖果;如果数组的序列是降序的,那么就是cnt[i]=cnt[i+1]+1.(这里注意一个细节,如果相邻评分相等,那么不遵循以上规则,也就是说,糖果数不变)
4.需要注意的是,如果是三角状的排序(先升序再降序,先降序再升序),其中那个位于三角状顶点的元素的糖果数的元素值会发生改变,所以我们需要取其中的一个最大值,以避免由于糖果数过少而毁掉规则。
class Solution {
public int candy(int[] ratings) {
int []cnt=new int[ratings.length];
Arrays.fill(cnt,1);
for(int i=1;i<ratings.length;i++){
int tmp=0;
if(ratings[i-1]<ratings[i]){
tmp=i;
while(tmp<ratings.length&&ratings[tmp]>ratings[tmp-1]){
cnt[tmp]=cnt[tmp-1]+1;
tmp++;
}
}
else if(ratings[i-1]>ratings[i]){
tmp=i;
int count=0;
while(tmp<ratings.length&&ratings[tmp]<ratings[tmp-1]){
count++;
tmp++;
}
int index=i;
while(count>0){
if(cnt[index-1]!=1)
cnt[index-1]=Math.max(cnt[index]+count,cnt[index-1]);
else
cnt[index-1]=cnt[index]+count;
count--;
index++;
}
}
else{
continue;
}
i=tmp-1;
}
int res=0;
for(int i=0;i<cnt.length;i++){
res+=cnt[i];
}
return res;
}
}