LeetCode:135. 分发糖果

简介: LeetCode:135. 分发糖果

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

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

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


示例 1:

输入:ratings = [1,0,2] 输出:5 解释:你可以分别给第一个、第二个、第三个孩子分发 2、1、2 颗糖果。 示例 2:

输入:ratings = [1,2,2] 输出:4 解释:你可以分别给第一个、第二个、第三个孩子分发 1、2、1 颗糖果。 第三个孩子只得到 1 颗糖果,这满足题面中的两个条件。  


提示:

n == ratings.length

1 <= n <= 2 * 104

0 <= ratings[i] <= 2 * 104

来源:力扣(LeetCode) 链接:leetcode.cn/problems/ca…


思路:

简单的两次遍历即可:把所有孩子的糖果数初始化为 1;先从左往右遍历一遍,如果右边孩子的评分比左边的高,则右边孩子的糖果数更新为左边孩子的糖果数加 1;再从右往左遍历一遍,如果左边孩子的评分比右边的高,且左边孩子当前的糖果数不大于右边孩子的糖果数,则左边孩子的糖果数更新为右边孩子的糖果数加 1。通过这两次遍历,分配的糖果就可以满足题目要求了。这里的贪心策略即为,在每次遍历中,只考虑并更新相邻一侧的大小关系

/**
 * @param {number[]} ratings
 * @return {number}
 */
var candy = function (ratings) {
    if (ratings.length < 2) {
        return ratings.length;
    }
    let candy = Array(ratings.length).fill(1);
    for (let i = 0; i < ratings.length; i++) {
        if (ratings[i] > ratings[i - 1]) {
            candy[i] = candy[i-1] + 1;
        }
    }
    for (let i = ratings.length; i > 0; i--) {
        if (ratings[i] < ratings[i - 1] && candy[i-1] <= candy[i]) {
               candy[i-1] = candy[i] + 1;
        }
    }
    return candy.reduce((a,b) => a + b,0)
};



目录
相关文章
|
测试技术
力扣888 公平糖果交换
力扣888 公平糖果交换
|
算法 Python
【Leetcode刷题Python】455.分发饼干
文章提供了解决LeetCode "分发饼干" 问题的Python实现代码,使用了排序和贪心算法。首先将孩子的胃口值和饼干的尺寸分别进行升序排序,然后通过双指针的方式遍历,尝试为每个孩子分配尺寸足够大的饼干,直到所有的孩子都得到满足或饼干分配完毕,返回满足的孩子数量的最大值。
92 2
|
存储 算法 数据可视化
如何使用多种算法解决LeetCode第135题——分发糖果问题
如何使用多种算法解决LeetCode第135题——分发糖果问题
|
算法
力扣经典150题第十五题:分发糖果
力扣经典150题第十五题:分发糖果
102 0
|
算法 机器人
【经典LeetCode算法题目专栏分类】【第5期】贪心算法:分发饼干、跳跃游戏、模拟行走机器人
【经典LeetCode算法题目专栏分类】【第5期】贪心算法:分发饼干、跳跃游戏、模拟行走机器人
|
算法 Java Go
【经典算法】LeetCode 1103 分糖果 II(Java/C/Python3实现含注释说明,Easy)
【经典算法】LeetCode 1103 分糖果 II(Java/C/Python3实现含注释说明,Easy)
184 0
[经典力扣面试题]135. 分发糖果
[经典力扣面试题]135. 分发糖果
|
算法
leetcode代码记录(分发饼干
leetcode代码记录(分发饼干
120 0
leetcode:455. 分发饼干
leetcode:455. 分发饼干
78 0
|
Java
leetcode-135:分发糖果
leetcode-135:分发糖果
94 0

热门文章

最新文章