代码随想录第三十四天 | 135. 分发糖果

164 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第12天,点击查看活动详情

135. 分发糖果

题目分析

给出一个整数数组,表示站成一排的N个孩子每个孩子的评分。要求根据两条要求分发糖果:每个孩子至少分配一个糖果,相邻两个孩子评分更高的孩子糖果更多。

解题

首先我们来考虑第1个条件,每个孩子至少分配一个糖果,所以我们可以初始给每一个孩子一个糖果。

接下来我们需要考虑第2个条件,相邻孩子评分更高的孩子可以分到更多的糖果。这个相邻有左相邻和右相邻。但是如果同时考虑左右的话会十分的混乱。所以我们先从左向右遍历确定右评分大于左评分的情况。如果右边孩子的评分比左边孩子的评分大,那么就可以多分右边孩子一个糖果。

这道题使用的是贪心的策略,如果每一个右边评分比左边评分高的还是比左边还是多得一个糖果,达到局部最优,进而达到全局最优。

接下来从右向左遍历,如果左边的孩子评分比右边孩子高,那么去左边孩子的糖果和右边孩子的糖果加一中较大者为左边孩子的糖果数。这样可以达到左边右边都满足条件。

代码如下:

var candy = function(ratings) {
    let candys = new Array(ratings.length).fill(1)
    for(let i = 0; 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)
    }
    let count = candys.reduce((a,b) => {return a + b})
    return count
};

上面代码中通过创建一个新的数组并将数组用1填充。代表每个孩子初始分到一个糖果。接下来的判断就很简单了,最后再将糖果数相加得出结果。