题目描述:
n 个孩子站成一排。给你一个整数数组 ratings 表示每个孩子的评分。
你需要按照以下要求,给这些孩子分发糖果:
每个孩子至少分配到 1 个糖果。
相邻两个孩子评分更高的孩子会获得更多的糖果。
请你给每个孩子分发糖果,计算并返回需要准备的 最少糖果数目 。
来源:力扣(LeetCode)
思路:
1)代码回想录,左右分别遍历的思想;手写出的贪心。
用一个数组记录每个位置的糖果数!感觉像动态规划
①正常的思路,就是左右都要比!
②累加的思想:比如 1 5 4 3 2 1
从右到左不是 i + 1 > i的比较,而是 i > i + 1的比较!进行累加
从左到右不是 i > i + 1的比较,而是 i + 1 > 1的比较!进行累加
代码:
1)贪心:还是不能找出 贪心准确的定义!
class Solution {
//只给了 评分的 数组,得到的结果是,需要准备的最少糖果数
public int candy(int[] ratings) {
int n = ratings.length;//最少要 这么多糖果
int[] flag = new int[n];
Arrays.fill(flag,1);
//左到右,高的加一
for(int i = 1;i <= n - 1;i++){
if(ratings[i] - ratings[i - 1] > 0 && flag[i] <= flag[i - 1]){//等于0不用加
flag[i] = flag[i - 1] + 1;//一定要比他大1;
}
}
//从右到左判断
for(int i = n - 2;i >= 0;i--){
if(ratings[i] - ratings[i + 1] > 0 && flag[i] <= flag[i + 1]){
flag[i] = flag[i + 1] + 1;
}
}
//遍历 记录数组,累加
int num = 0;
for(int i = 0;i < n;i++){
num += flag[i];
}
return num;
}
}