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