44 lines
2.0 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* 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;
}