这道题目一定是要确定一边之后,再确定另一边,例如比较每一个孩子的左边,然后再比较右 边,如果两边一起考虑一定会顾此失彼。

先确定右边评分大于左边的情况(也就是从前向后遍历)

此时局部最优:只要右边评分比左边大,右边的孩子就多一个糖果,全局最优:相邻的孩子中, 评分高的右孩子获得比左边孩子更多的糖果

局部最优可以推出全局最优。

如果ratings[i] > ratings[i - 1] 那么[i]的糖 一定要比[i - 1]的糖多一个,所以贪心: candyVec[i] = candyVec[i - 1] + 1

再确定左孩子大于右孩子的情况(从后向前遍历)

因为如果从前向后遍历,根据 ratings[i + 1] 来确定 ratings[i] 对应的糖果,那么每次都 不能利用上前一次的比较结果了。

所以确定左孩子大于右孩子的情况一定要从后向前遍历!

如果 ratings[i] > ratings[i + 1],此时candyVec[i](第i个小孩的糖果数量)就有两个 选择了,一个是candyVec[i + 1] + 1(从右边这个加1得到的糖果数量),一个是 candyVec[i](之前比较右孩子大于左孩子得到的糖果数量)。

那么又要贪心了,局部最优:取candyVec[i + 1] + 1 和 candyVec[i] 最大的糖果数量, 保证第i个小孩的糖果数量即大于左边的也大于右边的。全局最优:相邻的孩子中,评分高的孩 子获得更多的糖果。

局部最优可以推出全局最优。

class Solution:def candy(self, ratings: List[int]) -> int:candy_res = [1] * len(ratings)for i in range(1, len(ratings)):if ratings[i] > ratings[i-1]:candy_res[i] = candy_res[i-1] + 1for j in range(len(ratings)-2,-1,-1):if ratings[j] > ratings[j+1]:candy_res[j] = max(candy_res[j],candy_res[j+1] + 1)return sum(candy_res)

170. Leetcode 135. 分发糖果 (贪心算法-两个维度权衡题目)相关推荐

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

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

  2. 171. Leetcode 406. 根据身高重建队列 (贪心算法-两个维度权衡题目)

    class Solution:def reconstructQueue(self, people: List[List[int]]) -> List[List[int]]:people.sort ...

  3. LeetCode 135. 分发糖果(DP)

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

  4. LeetCode 135 分发糖果

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

  5. leetcode 135. 分发糖果

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

  6. leetcode 135分发糖果

    这是一道hard题,不好想,但最后还是想出来了,私以为还是根据一些思想方法自己想出来做法印象比较深刻,其次看人家的做法思想自己写代码,其次看代码理解默写,其次直接抄代码: 首先,给每个孩子都发一个糖果 ...

  7. 2022-4-10 Leetcode 135.分发糖果

    官方题解 class Solution {public:int candy(vector<int>& ratings) {int n = ratings.size();vector ...

  8. 148. Leetcode 455. 分发饼干 (贪心算法-基础题目)

    class Solution:def findContentChildren(self, g: List[int], s: List[int]) -> int:g.sort()s.sort()m ...

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

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

最新文章

  1. vantui框架_vue移动端优秀框架收集
  2. java arraylist json_java Arraylist转json 对象转json
  3. 百家争鸣|国内外NLP领域学术界和工业界的牛人和团队
  4. 如何确定foreach循环中的第一次和最后一次迭代?
  5. 关系型数据库与NOSQL
  6. SSH中后台传到前台一个信息集合,tr td中怎么进行排列,类似在一个div里排列书籍...
  7. 《系统集成项目管理工程师》必背100个知识点-36范围变更的遇到的问题
  8. Signals Slots(Qt5)
  9. Web Service Software Factory 入门
  10. scala 冒泡排序
  11. 用PWA构建一个完全离线的网站
  12. 单位阶跃函数的傅里叶变换_傅里叶变换学习笔记(9)
  13. JVM学习笔记 -- 从一段几乎所有人代码都会犯错的代码开始
  14. 13.15. ftp fs
  15. 【裂缝识别】基于matlab组合BCOSFIRE过滤器墙体裂缝识别【含Matlab源码 321期】
  16. android模拟器录制视频教程,夜神安卓模拟器怎么录制视频 夜神安卓模拟器录制视频教程...
  17. c语言other用法,other的用法总结
  18. 相机快门、 光圈有啥区别?
  19. WindowsLive™ OneCare™初体验
  20. MAC系统安装JDK和环境变量配置

热门文章

  1. 【转】Kettle集群
  2. 穷游网:这里有一个包含十二年用户体验妙计的锦囊
  3. Oracle For 循环添加数据
  4. 如何避免面试中薪水要的太高或太低?
  5. 一个好用的ODBC数据库类CMYODBC
  6. 对Struts2的认识(-)
  7. 中国开封菊花花会照片1
  8. SecureCRT脚本之WaitForString函数
  9. python中的矩阵运算
  10. 【Linux入门连载二】Linux系统有哪些基本目录?