老师想给孩子们分发糖果,有 N 个孩子站成了一条直线,老师会根据每个孩子的表现,预先给他们评分。
你需要按照以下要求,帮助老师给这些孩子分发糖果:
每个孩子至少分配到 1 个糖果。
相邻的孩子中,评分高的孩子必须获得更多的糖果。
那么这样下来,老师至少需要准备多少颗糖果呢?
示例 1:
输入: [1,0,2]
输出: 5
解释: 你可以分别给这三个孩子分发 2、1、2 颗糖果。
示例 2:
输入: [1,2,2]
输出: 4
解释: 你可以分别给这三个孩子分发 1、2、1 颗糖果。
第三个孩子只得到 1 颗糖果,这已满足上述两个条件。
题目理解:1.给孩子分发糖果,要求相邻的数字大的糖果多,想等的可以小。
相邻的元素之间,有数量多少关系满足即可。细化成peak最大 ,左右均小。进一步细化为将数组细化为一个个的山峰,有 残缺的山峰而已。
题目本质:遍历一遍,记录山谷到山峰,山峰到山谷。如此往复。 相同的数字记为1开始最小的。
题目应用:有规律的重复性出现的局部规律,可以 应用到全局;规律可以具有泛化性,容忍一些极端特殊情况。
问题:相等的处理方式,相等就认为是最小的1;然后重新开始。
package com.jd.jr.nlp;
public class Solution135Diy {
/**
* while 遍历, 上坡 下坡作为 一个循环,求和。 相等的视为最小的,根据后面的判断是递增还是递减
*
*
* @param ratings
* @return
*/
public int candy(int[] ratings) {
int s=0;
int i=0;
int sum=1;
while (i<ratings.length-1){
while (i<ratings.length-1 && ratings[i]<ratings[i+1]){
i++;
}
int left=i-s;
s=i;
while (i<ratings.length-1 && ratings[i]>ratings[i+1]){
i++;
}
int right=i-s;
s=i;
int max=Math.max(left,right)+1;
sum+=((1+left)*left/2+(1+right)*right/2)+max-1;
while (i<ratings.length-1 && ratings[i]==ratings[i+1]){
sum++;
i++;
s++;
}
}
return sum;
}
public static void main(String[] args){
int[] ratins=new int[]{1,0,2};
// 4
// ratins=new int[]{1,2,2};
// 7
// ratins=new int[]{1,3,2,2,1};
Solution135Diy solution135Diy=new Solution135Diy();
int result=solution135Diy.candy(ratins);
System.out.println("============");
System.out.println(result);
}
}