分发糖果

分发糖果

https://leetcode.cn/problems/candy/description/

图 0

思路

题目要求和相邻的孩子比较,相邻的孩子有两个,左边的和右边的。

一次遍历解决两边的孩子,容易顾此失彼,所以可以分两次遍历

正序遍历时考虑左边的孩子(当前节点左边的),如果ratings[i]>ratings[i-1],那么candys[i] = candys[i-1]+1。

逆序遍历考虑右边的孩子(当前节点右边的),如果ratings[i] > ratings[i+1],那么
candys[i] = Math.max(candys[i], candys[i+1]+1)。

正序遍历做的事儿和反序遍历做的事儿不能对调,因为正序时,当前元素的左边元素一定时都处理过的,这样不会出错。反之逆序时,当前节点的右边节点也都处理过,不会出错。

求解

1
2
3
4
5
6
7
8
9
10
11
12
13
14
var candy = function(ratings) {
let candys = new Array(ratings.length).fill(1);
for(let i=1;i<ratings.length;i++){
if(ratings[i]>ratings[i-1]){
candys[i] = candys[i-1]+1;
}
}
for(let i=ratings.length-2;i>=0;i--){
if(ratings[i]>ratings[i+1]){
candys[i] = Math.max(candys[i],candys[i+1]+1)
}
}
return candys.reduce((a,b)=>a+b,0)
};