Skip to content
On this page

分发糖果

Question

n 个孩子站成一排。给你一个整数数组 ratings 表示每个孩子的评分。

你需要按照以下要求,给这些孩子分发糖果:

  • 每个孩子至少分配到 1 个糖果。
  • 相邻两个孩子评分更高的孩子会获得更多的糖果。
  • 请你给每个孩子分发糖果,计算并返回需要准备的 最少糖果数目
image-20230618095411685

思路

那么本题我采用了两次贪心的策略:

  • 一次是从左到右遍历,只比较右边孩子评分比左边大的情况。
  • 一次是从右到左遍历,只比较左边孩子评分比右边大的情况。

这样从局部最优推出了全局最优,即:相邻的孩子中,评分高的孩子获得更多的糖果。

image-20230618104844385
js
var candy = function(ratings) {
    let n = ratings.length
    let candy = []						//记录每个人的糖果数
    for(let i=0;i<n;i++){candy[i]=1}	
    for(let i=1; i<n; i++){				//左到右遍历
        if(ratings[i]>ratings[i-1] && candy[i]<=candy[i-1])
            candy[i] = candy[i-1]+1
    }
    for(let i=n-2; i>=0; i--){			//右到左遍历
        if(ratings[i]>ratings[i+1] && candy[i]<=candy[i+1])
            candy[i] = candy[i+1]+1
    }
    return candy.reduce((pre,cur)=>pre+cur,0)
};