内容简介:# 题目老师想给孩子们分发糖果,有 N 个孩子站成了一条直线,老师会根据每个孩子的表现,预先给他们评分。你需要按照以下要求,帮助老师给这些孩子分发糖果:
# 题目
老师想给孩子们分发糖果,有 N 个孩子站成了一条直线,老师会根据每个孩子的表现,预先给他们评分。
你需要按照以下要求,帮助老师给这些孩子分发糖果:
每个孩子至少分配到 1 个糖果。
相邻的孩子中,评分高的孩子必须获得更多的糖果。
那么这样下来,老师至少需要准备多少颗糖果呢?
示例 1:
输入: [1,0,2] 输出: 5 解释: 你可以分别给这三个孩子分发 2、1、2 颗糖果。
示例 2:
输入: [1,2,2] 输出: 4 解释: 你可以分别给这三个孩子分发 1、2、1 颗糖果。 第三个孩子只得到 1 颗糖果,这已满足上述两个条件。
题解
- 我们首先给每一个小朋友都发糖果,保证每位喜至少分配到一个糖果;
- 从左到右遍历,考虑右边的小朋友比左边小朋友排名高的情况,此时更新为 candy[i] = candy[i - 1] + 1,暂时不考虑左边比右边高的情况;
- 从右到左遍历,考虑左边比右边高的情况,希望左边比右边高,但是又需要考虑不破坏第二点中的已经满足的规则,所以更新条件为candy[i] = max(candy[i], candy[i + 1] + 1);
- 把所有的分配加起来;
class Solution { public int candy(int[] ratings) { if (ratings == null || ratings.length == 0) return 0; int[] resCandy = new int[ratings.length]; for (int i = 0; i < resCandy.length; i++) { resCandy[i] = 1; } for (int i = 1; i < ratings.length; i++) { // 比左边的小朋友排名更高. if (ratings[i] > ratings[i - 1]) { resCandy[i] = resCandy[i - 1] + 1; } } for (int i = ratings.length - 2; i >= 0; i--) { // 当前比右边的小朋友排名更高.resCandy[i] = resCandy[i + 1] + 1 // 同时需要保证不破坏当前比左边小朋友高的规则 if (ratings[i] > ratings[i + 1]) { resCandy[i] = Math.max(resCandy[i + 1] + 1, resCandy[i]); } } int res = 0; for (int i = 0; i < resCandy.length; i++) { res += resCandy[i]; } return res; } }
热门阅读
以上所述就是小编给大家介绍的《【Leetcode】135.分发糖果》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- 【LeetCode】贪心算法--分发糖果(135)
- 如何在AI中创建糖果怪物
- 三分钟看完「分糖果」算法问题
- 第五届蓝桥杯Java B——分糖果
- View的事件分发(一)分发流程
- Android事件分发机制
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Learn Python the Hard Way
Zed Shaw / Example Product Manufacturer / 2011
This is a very beginner book for people who want to learn to code. If you can already code then the book will probably drive you insane. It's intended for people who have no coding chops to build up t......一起来看看 《Learn Python the Hard Way》 这本书的介绍吧!