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. 分发糖果相关推荐

  1. 通俗易懂:贪心算法(一):分配问题 (力扣455分发饼干 和135分发糖果)

    看完本文,可以顺便解决leetcode以下两个题目: 455.分发饼干(简单) 135.分发糖果(困难) 一.通俗易懂的 贪心算法 |思想 贪心算法就是采用贪心的策略,保证每一次的操作都是局部最优的, ...

  2. 135. 分发糖果 【每日一题】

    135. 分发糖果 思路 两次遍历,先从左到右计算出每个人的糖果数,这一步就是后一个比前一个大就在前一个基础上+1,不然置为1,从这个思路来来看,我们这一趟酒吧升序的给基本算好了,但是降序的我们现在全 ...

  3. 【LeetCode】贪心算法--分发糖果(135)

    今日题目 老师想给孩子们分发糖果,有N个孩子站成了一条直线,老师会根据每个孩子的表现,预先给他们评分. 你需要按照以下要求,帮助老师给这些孩子分发糖果: 每个孩子至少分配到 1 个糖果.相邻的孩子中, ...

  4. 135. 分发糖果(困难)-贪心

    一.题目描述 n 个孩子站成一排.给你一个整数数组 ratings 表示每个孩子的评分. 你需要按照以下要求,给这些孩子分发糖果: 每个孩子至少分配到 1 个糖果. 相邻两个孩子评分更高的孩子会获得更 ...

  5. 135. 分发糖果(贪心算法)

    老师想给孩子们分发糖果,有 N 个孩子站成了一条直线,老师会根据每个孩子的表现,预先给他们评分. 你需要按照以下要求,帮助老师给这些孩子分发糖果: 每个孩子至少分配到 1 个糖果. 评分更高的孩子必须 ...

  6. 135. 分发糖果002(贪心算法+思路+详解)

    一:题目 老师想给孩子们分发糖果,有 N 个孩子站成了一条直线,老师会根据每个孩子的表现,预先给他们评分. 你需要按照以下要求,帮助老师给这些孩子分发糖果: 每个孩子至少分配到 1 个糖果. 评分更高 ...

  7. LeetCode 135. 分发糖果(贪心算法)

    题目描述 老师想给孩子们分发糖果,有 N 个孩子站成了一条直线,老师会根据每个孩子的表现,预先给他们评分. 你需要按照以下要求,帮助老师给这些孩子分发糖果: 每个孩子至少分配到 1 个糖果. 相邻的孩 ...

  8. LeetCode 135 分发糖果

    题目描述 老师想给孩子们分发糖果,有 N 个孩子站成了一条直线,老师会根据每个孩子的表现,预先 给他们评分.你需要按照以下要求,帮助老师给这些孩子分发糖果:每个孩子至少分配到 1 个糖果. 相邻的孩子 ...

  9. leetcode 135. 分发糖果

    老师想给孩子们分发糖果,有 N 个孩子站成了一条直线,老师会根据每个孩子的表现,预先给他们评分. 你需要按照以下要求,帮助老师给这些孩子分发糖果: 每个孩子至少分配到 1 个糖果. 相邻的孩子中,评分 ...

最新文章

  1. 【强势来袭】Node.js(nodejs)实现“一口多用”(含用户创建、登录、鉴权token) 一个文件解决所有常态化需求
  2. iptables 入门
  3. 三章:CentOS6.5 更改时区设置、安装samba、install VMware、install XFS 、install XFS --parted
  4. VTK修炼之道19:图像基本操作_图像像素值的访问与修改
  5. Map的并发处理(ConcurrentHashMap)
  6. JavaScript Map 和 Set
  7. TeleportPoint可瞬移的目标位置
  8. PHP表单入库处理,ThinkPHP收集表单数据入库操作(三种方式)
  9. SolidWorks零件改名后与工程图关联教程
  10. 01 牛顿迭代公式
  11. C语言实现可视化,运用EasyX实现拼图+文字解谜+迷宫+猜数游戏
  12. 全球及中国电解电容器(E-Cap)供给能力与竞争状况分析报告2022~2027年
  13. 都2021年了,你不会还没掌握响应式网页设计吧?
  14. 三相维也纳pfc,开关电源,三相AC输入无桥pfc±400vDC输出,已经量产两年非常成熟,包括源代码
  15. opencv 白平衡之灰度世界算法
  16. 拓嘉辰丰电商:拼多多店铺指标有哪些对于参加活动比较重要
  17. Lucas定理和拓展Lucas定理
  18. NirCmd v2.37帮助文档中文译本
  19. 俄罗斯电商平台ozon的崛起,卖家可以使用测评补单方式打造爆款吗?
  20. PPT转PDF怎么转?这几种转换小技巧轻松拿捏

热门文章

  1. KF6203原厂高压LDO线性稳压IC
  2. WooYun-2016-199433 phpmyadmin反序列化漏洞复现
  3. 乐山市计算机学校成教中心,乐山市计算机学校:网络教育开学典礼顺利举行
  4. 来自越南的泛泰binx一键解压_卡刷包制作工具
  5. 基于I2C硬件协议的AH20温湿度传感器的数据采集
  6. 编写VC++日志类(Logger) ---- 方便调试
  7. 对Fontforge中单个字符map自动校验中的错误的分析
  8. IOS、安卓IM语音聊天开发初探部分心得——网络基础篇
  9. AI如何改变智能城市物联网?
  10. 全国青少年软件编程(Scratch)等级考试一级真题——2021.9