44 lines
2.0 KiB
JavaScript
44 lines
2.0 KiB
JavaScript
/**
|
||
* https://leetcode.cn/problems/candy/?envType=study-plan-v2&envId=top-interview-150
|
||
* @param {number[]} ratings
|
||
* @return {number}
|
||
*/
|
||
const candy = function (ratings) {
|
||
|
||
};
|
||
|
||
/*
|
||
贪心算法,每个孩子至少分一颗糖果,所以一开始就初始化糖果数组所有元素为1,假设我们是中间的那个孩子,如果我评分比左边的孩子高
|
||
我应该就要比他多获得一个糖果,如果我们比右边的孩子评分高,我们就应该比右边的孩子多一个糖果,但是我们在处理时先从左往右处理,
|
||
也就是如果当前孩子比左边孩子评分高就在之前的孩子基础上加上1,这样处理之后会发生一个问题,就是前面的孩子在评分比后面孩子高的时候
|
||
它获得的糖果已经比后面的孩子多了,所以在处理右边孩子的时候,需要比较当前值和后面孩子糖果加一谁大,取大的那个值,说起来挺难理解,
|
||
自己用三个孩子思考一下,还是很好理解的。
|
||
*/
|
||
|
||
function f1(ratings) {
|
||
const n = ratings.length;
|
||
// 初始化糖果数组
|
||
const candies = new Array(n).fill(1);
|
||
// 从左往右处理孩子,如果当前孩子的评分比之前孩子高,当前孩子的糖果数改为之前孩子的糖果数加1
|
||
for (let i = 1; i < n; i++) {
|
||
if (ratings[i] > ratings[i - 1]) {
|
||
candies[i] = candies[i - 1] + 1;
|
||
}
|
||
}
|
||
// 从右往左遍历,如果当前孩子的评分高,就必须保证当前孩子的糖果数比后面孩子的糖果数加1大,但是经过从左往右的处理
|
||
// 当前孩子在评分高的情况下糖果数已经大于右边孩子,这样就已经满足要求了,就不要处理了
|
||
for (let i = n - 2; i >= 0; i--) {
|
||
if (ratings[i] > ratings[i + 1]) {
|
||
candies[i] = Math.max(candies[i], candies[i + 1] + 1);
|
||
}
|
||
}
|
||
|
||
// 返回总糖果数
|
||
// return candies.reduce((total, cur) => total + cur, 0);
|
||
let total = 0;
|
||
for (let i = 0; i < n; i++) {
|
||
total += candies[i];
|
||
}
|
||
return total;
|
||
}
|