贪心 135. 分发糖果
135. 分发糖果
难度困难1086
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
思路
先理解一下题意,他说是要根据孩子评分给每一个孩子分糖果.每一个孩子至少分配一个糖果,还有一重要的点是,相邻两个孩子评分更高的孩子会获得更多的糖果
意思就是对于一个孩子来说,除了两边,既与左面孩子相邻,也与右边孩子相邻.
所以我们就要一边一边进行考虑
- 右孩子大于左孩子的情况(需要从前往后遍历)
- 左孩子大于右孩子的情况(需要从后往前遍历)
但要保证对于每一个孩子来说,他既要比左面糖果多也要比右面糖果多,所以要取最大值.
思路总结
- 从前往后遍历一遍数组,如果该孩子比它左边孩子评分高,就比左边孩子多一个糖果ratings[i]>ratings[i-1] ==> res[i] = res[i-1] +1; 右边孩子比左边孩子糖果多,达到局部最优,最终给所有孩子分完,全局最优
- 从后往前遍历一边数组,如果该孩子比它右边孩子评分高,就比右边孩子多一个糖果ratings[i]>ratings[i+1] ==> res[i] = res[i+1] +1;左边孩子比右边孩子糖果多,达到局部最优,最终给所有孩子分完,全局最优
- 对于一个孩子,既要比左面孩子评分高,也比右边孩子评分高,所以要取最大
- 最后将结果数组res累加即可
第二步和第三步在代码层次可以合起来,因为只有一个孩子,既要比左面孩子评分高,也比右边孩子评分高,才会既要比左边孩子分的糖果多也要比右边孩子分的糖果多,==>res[i] = Math.max(res[i],res[i+1]+1) ; res[i]为已经计算好的了,一个孩子比它左面分高 res[i+1]+1,一个孩子比它右面孩子分高,取最大即可.
class Solution {public int candy(int[] ratings) {int[] res = new int[ratings.length];Arrays.fill(res,1);//每个孩子至少分配到 1 个糖果。for(int i =1;i<ratings.length;++i) {if(ratings[i]>ratings[i-1]) {//一个孩子比它左面孩子评分高,就多分一个糖果res[i] = res[i-1] + 1;}}int sum = 0;for(int i =ratings.length-2;i>=0;--i) {if(ratings[i]>ratings[i+1]) {//一个孩子比它右面孩子评分高,就多分一个糖果//对于一个孩子既要比左边孩子评分高也比右边孩子评分高,所以糖果要比两个都多,所以要取最大==>糖果既要比左面多也比右边多res[i] = Math.max(res[i],res[i+1]+1);}}int ans = 0;for(int i=0;i<ratings.length;++i) ans += res[i];return ans;}
}
总结 :
该题需要两个维度进行考虑,先考虑一边,再去考虑另外一边,不能同时考虑,要不都顾不过来.
出现两种维度的情况下,需要先确定好一个维度,在确定另外一个维度
贪心 135. 分发糖果相关推荐
- 通俗易懂:贪心算法(一):分配问题 (力扣455分发饼干 和135分发糖果)
看完本文,可以顺便解决leetcode以下两个题目: 455.分发饼干(简单) 135.分发糖果(困难) 一.通俗易懂的 贪心算法 |思想 贪心算法就是采用贪心的策略,保证每一次的操作都是局部最优的, ...
- 135. 分发糖果 【每日一题】
135. 分发糖果 思路 两次遍历,先从左到右计算出每个人的糖果数,这一步就是后一个比前一个大就在前一个基础上+1,不然置为1,从这个思路来来看,我们这一趟酒吧升序的给基本算好了,但是降序的我们现在全 ...
- 【LeetCode】贪心算法--分发糖果(135)
今日题目 老师想给孩子们分发糖果,有N个孩子站成了一条直线,老师会根据每个孩子的表现,预先给他们评分. 你需要按照以下要求,帮助老师给这些孩子分发糖果: 每个孩子至少分配到 1 个糖果.相邻的孩子中, ...
- 135. 分发糖果(困难)-贪心
一.题目描述 n 个孩子站成一排.给你一个整数数组 ratings 表示每个孩子的评分. 你需要按照以下要求,给这些孩子分发糖果: 每个孩子至少分配到 1 个糖果. 相邻两个孩子评分更高的孩子会获得更 ...
- 135. 分发糖果(贪心算法)
老师想给孩子们分发糖果,有 N 个孩子站成了一条直线,老师会根据每个孩子的表现,预先给他们评分. 你需要按照以下要求,帮助老师给这些孩子分发糖果: 每个孩子至少分配到 1 个糖果. 评分更高的孩子必须 ...
- 135. 分发糖果002(贪心算法+思路+详解)
一:题目 老师想给孩子们分发糖果,有 N 个孩子站成了一条直线,老师会根据每个孩子的表现,预先给他们评分. 你需要按照以下要求,帮助老师给这些孩子分发糖果: 每个孩子至少分配到 1 个糖果. 评分更高 ...
- LeetCode 135. 分发糖果(贪心算法)
题目描述 老师想给孩子们分发糖果,有 N 个孩子站成了一条直线,老师会根据每个孩子的表现,预先给他们评分. 你需要按照以下要求,帮助老师给这些孩子分发糖果: 每个孩子至少分配到 1 个糖果. 相邻的孩 ...
- LeetCode 135 分发糖果
题目描述 老师想给孩子们分发糖果,有 N 个孩子站成了一条直线,老师会根据每个孩子的表现,预先 给他们评分.你需要按照以下要求,帮助老师给这些孩子分发糖果:每个孩子至少分配到 1 个糖果. 相邻的孩子 ...
- leetcode 135. 分发糖果
老师想给孩子们分发糖果,有 N 个孩子站成了一条直线,老师会根据每个孩子的表现,预先给他们评分. 你需要按照以下要求,帮助老师给这些孩子分发糖果: 每个孩子至少分配到 1 个糖果. 相邻的孩子中,评分 ...
最新文章
- 【强势来袭】Node.js(nodejs)实现“一口多用”(含用户创建、登录、鉴权token) 一个文件解决所有常态化需求
- iptables 入门
- 三章:CentOS6.5 更改时区设置、安装samba、install VMware、install XFS 、install XFS --parted
- VTK修炼之道19:图像基本操作_图像像素值的访问与修改
- Map的并发处理(ConcurrentHashMap)
- JavaScript Map 和 Set
- TeleportPoint可瞬移的目标位置
- PHP表单入库处理,ThinkPHP收集表单数据入库操作(三种方式)
- SolidWorks零件改名后与工程图关联教程
- 01 牛顿迭代公式
- C语言实现可视化,运用EasyX实现拼图+文字解谜+迷宫+猜数游戏
- 全球及中国电解电容器(E-Cap)供给能力与竞争状况分析报告2022~2027年
- 都2021年了,你不会还没掌握响应式网页设计吧?
- 三相维也纳pfc,开关电源,三相AC输入无桥pfc±400vDC输出,已经量产两年非常成熟,包括源代码
- opencv 白平衡之灰度世界算法
- 拓嘉辰丰电商:拼多多店铺指标有哪些对于参加活动比较重要
- Lucas定理和拓展Lucas定理
- NirCmd v2.37帮助文档中文译本
- 俄罗斯电商平台ozon的崛起,卖家可以使用测评补单方式打造爆款吗?
- PPT转PDF怎么转?这几种转换小技巧轻松拿捏
热门文章
- KF6203原厂高压LDO线性稳压IC
- WooYun-2016-199433 phpmyadmin反序列化漏洞复现
- 乐山市计算机学校成教中心,乐山市计算机学校:网络教育开学典礼顺利举行
- 来自越南的泛泰binx一键解压_卡刷包制作工具
- 基于I2C硬件协议的AH20温湿度传感器的数据采集
- 编写VC++日志类(Logger) ---- 方便调试
- 对Fontforge中单个字符map自动校验中的错误的分析
- IOS、安卓IM语音聊天开发初探部分心得——网络基础篇
- AI如何改变智能城市物联网?
- 全国青少年软件编程(Scratch)等级考试一级真题——2021.9