本文 https://github.com/youngyangyang04/leetcode-master 已经收录,里面还有leetcode刷题攻略、各个类型经典题目刷题顺序、思维导图,可以fork到自己仓库,有空看一看一定会有所收获,如果对你有帮助也给一个star支持一下吧!

本周开始恢复了题目系列。

对于贪心,大多数同学都会感觉,不就是常识嘛,这算啥算法,那么本周的题目就可以带大家初步领略一下贪心的巧妙,贪心算法往往妙的出其不意。

周一

在贪心算法:加油站中给出每一个加油站的汽油和开到这个加油站的消耗,问汽车能不能开一圈。

这道题目咋眼一看,感觉是一道模拟题,模拟一下汽车从每一个节点出发看看能不能开一圈,时间复杂度是O(n^2)。

即使用模拟这种情况,也挺考察代码技巧的。

for循环适合模拟从头到尾的遍历,而while循环适合模拟环形遍历,对于本题的场景要善于使用while!

如果代码功力不到位,就模拟这种情况,可能写的也会很费劲。

本题的贪心解法,我给出两种解法。

对于解法一,其实我并不认为这是贪心,因为没有找出局部最优,而是直接从全局最优的角度上思考问题,但思路很巧妙,值得学习一下。

对于解法二,贪心的局部最优:当前累加rest[j]的和curSum一旦小于0,起始位置至少要是j+1,因为从j开始一定不行。全局最优:找到可以跑一圈的起始位置。

这里是可以从局部最优推出全局最优的,想不出反例,那就试试贪心。

解法二就体现出贪心的精髓,同时大家也会发现,虽然贪心是常识,有些常识并不容易,甚至很难!

周二

在贪心算法:分发糖果中我们第一次接触了需要考虑两个维度的情况。

例如这道题,是先考虑左边呢,还是考虑右边呢?

先考虑哪一边都可以! 就别两边一起考虑,那样就把自己陷进去了

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

如图:

接着在贪心另一边,左孩子大于右孩子,左孩子的糖果就要比右孩子多。

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

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

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

如图:

周三

在贪心算法:柠檬水找零中我们模拟了买柠檬水找零的过程。

这道题目刚一看,可能会有点懵,这要怎么找零才能保证完整全部账单的找零呢?

但仔细一琢磨就会发现,可供我们做判断的空间非常少!

美元10只能给账单20找零,而美元5可以给账单10和账单20找零,美元5更万能!

局部最优:遇到账单20,优先消耗美元10,完成本次找零。全局最优:完成全部账单的找零。

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

所以把能遇到的情况分析一下,只要分析到具体情况了,一下子就豁然开朗了。

这道题目其实是一道简单题,但如果一开始就想从整体上寻找找零方案,就会把自己陷进去,各种情况一交叉,只会越想越复杂了。

周四

在贪心算法:根据身高重建队列中,我们再一次遇到了需要考虑两个维度的情况。

之前我们已经做过一道类似的了就是贪心算法:分发糖果,但本题比分发糖果难不少!

贪心算法:根据身高重建队列中依然是要确定一边,然后在考虑另一边,两边一起考虑一定会蒙圈。

那么本题先确定k还是先确定h呢,也就是究竟先按h排序呢,还先按照k排序呢?

这里其实很考察大家的思考过程,如果按照k来从小到大排序,排完之后,会发现k的排列并不符合条件,身高也不符合条件,两个维度哪一个都没确定下来。

所以先从大到小按照h排个序,再来贪心k

此时局部最优:优先按身高高的people的k来插入。插入操作过后的people满足队列属性。全局最优:最后都做完插入操作,整个队列满足题目队列属性。

局部最优可以推出全局最优,找不出反例,那么就来贪心。

总结

「代码随想录」里已经讲了十一道贪心题目了,大家可以发现在每一道题目的讲解中,我都是把什么是局部最优,和什么是全局最优说清楚。

虽然有时候感觉贪心就是常识,但如果真正是常识性的题目,其实是模拟题,就不是贪心算法了!例如贪心算法:加油站中的贪心方法一,其实我就认为不是贪心算法,而是直接从全局最优的角度上来模拟,因为方法里没有体现局部最优的过程。

而且大家也会发现,贪心并没有想象中的那么简单,贪心往往妙的出其不意,触不及防!哈哈

下周依然还是贪心,敬请期待!

我是程序员Carl,可以找我组队刷题,也可以在B站上找到我,本文leetcode刷题攻略已收录,更多精彩算法文章尽在公众号:代码随想录,关注后就会发现和「代码随想录」相见恨晚!

循序渐进学算法,认准「代码随想录」,Carl手把手带你过关斩将!

「手把手带你学算法」本周小结!(贪心算法系列三)相关推荐

  1. ​越学越有趣:『手把手带你学NLP』系列项目01 ——词向量应用的那些事儿

    点击左上方蓝字关注我们 课程简介 "手把手带你学NLP"是基于飞桨PaddleNLP的系列实战项目.本系列由百度多位资深工程师精心打造,提供了从词向量.预训练语言模型,到信息抽取. ...

  2. 越学越有趣:『手把手带你学NLP』系列项目02 ——语义相似度计算的那些事儿...

    点击左上方蓝字关注我们 课程简介 "手把手带你学NLP"是基于飞桨PaddleNLP的系列实战项目.本系列由百度多位资深工程师精心打造,提供了从词向量.预训练语言模型,到信息抽取. ...

  3. 【手把手带你学Java EE】多线程那些事,你了解了吗?

    [手把手带你学Java EE]多线程那些事,你了解了吗? 线程 概念 意义 进程和线程的区别 面试题:谈谈进程和线程的区别和联系 Java中的多线程编程 创建线程的方法 方法一 方法二 方法三 &am ...

  4. 2.7mnist手写数字识别之训练调试与优化精讲(百度架构师手把手带你零基础实践深度学习原版笔记系列)

    2.7mnist手写数字识别之训练调试与优化精讲(百度架构师手把手带你零基础实践深度学习原版笔记系列) 目录 2.7mnist手写数字识别之训练调试与优化精讲(百度架构师手把手带你零基础实践深度学习原 ...

  5. 3.1 计算机视觉的发展和卷积神经网络概要(百度架构师手把手带你零基础实践深度学习原版笔记系列)

    3.1 计算机视觉的发展和卷积神经网络(百度架构师手把手带你零基础实践深度学习原版笔记系列) 概要 计算机视觉作为一门让机器学会如何去"看"的科学学科,具体的说,就是让机器去识别摄 ...

  6. 提高篇 第一部分 基础算法 第1章 贪心算法

    一本通提高篇在线提交地址 一本通提高篇在线提交地址_老象的专栏-CSDN博客 [ 贪心 进阶总结 ][ 来自一本通提高篇 ] [ 贪心 进阶总结 ][ 来自一本通提高篇 ]_violinwang-CS ...

  7. java贪心算法 区间调度_贪心算法-区间调度问题解之证明(示例代码)

    一.贪心算法 定义:一个算法是贪心算法,如果它是通过一些小的步骤来一个求解,并且在每一步根据局部情况选择一个决定,使得某些主要的指标得到优化. 二.区间调度问题 1. 问题:我们有一组需求{1,2,3 ...

  8. (十四)算法设计思想之“贪心算法”

    算法设计思想之"贪心算法" 贪心算法是什么 LeetCode:455.分饼干 LeetCode:122.买卖股票的最佳时机II 思考题 贪心算法是什么 贪心算法是算法设计中的一种方 ...

  9. 疯子的算法总结(四)贪心算法

    一.贪心算法 解决最优化问题的算法一般包含一系列的步骤,每一步都有若干的选择.对于很多最优化问题,只需要采用简单的贪心算法就可以解决,而不需要采用动态规划方法.贪心算法使所做的局部选择看起来都是当前最 ...

  10. _28LeetCode代码随想录算法训练营第二十八天-贪心算法 | 122.买卖股票的最佳时机II 、55.跳跃游戏、45.跳跃游戏II

    _28LeetCode代码随想录算法训练营第二十八天-贪心算法 | 122.买卖股票的最佳时机II .55.跳跃游戏.45.跳跃游戏II 题目列表 122.买卖股票的最佳时机II 55.跳跃游戏 45 ...

最新文章

  1. shell脚本学习之参数传递
  2. (chap2 TCP/IP基础知识) TCP/IP协议分层模型
  3. 通向架构师的道路(第十一天)之Axis2 Web Service(二)
  4. 计算机视觉python入门_计算机视觉应该怎样入门?
  5. 解决css引用字体跨域问题
  6. 字符串匹配——C++使用Regex
  7. matlab得到小波参数,matlab小波分析去噪详解
  8. 汉字为什么能流传至今_《汉字为什么是方块字(节选)》阅读附答案
  9. Android项目无用文件 BAT批处理 清理
  10. iPhone6分辨率与适配
  11. mini QQ(项目一)
  12. JavaScript根据开始时间和结束时间计算具体礼拜几
  13. chr 13 java 替换_Java ROT13编码转换算法实现
  14. 过了所有技术面,却倒在 HR 一个问题上
  15. STM32_BKP备份数据
  16. 谷歌关闭SameSite功能
  17. canopen pdo通信c语言,CANopen通信之PDO通信
  18. 数仓 元数据管理 Atlas 的使用
  19. python数据分析要求高性能计算机_Python数据分析初体验,需要解答的三大问题!...
  20. 高光谱遥感图像处理(14)-----ENVI使用教程之监督分类与非监督分类

热门文章

  1. Apache实现一个IP配置多个站点
  2. *最近培训的一个题目:蚂蚁爬竿
  3. 【CDH】cdh搭建遇到的坑和解决过程
  4. Web Worker——js的多线程,实现统计博客园总阅读量
  5. 73.fseek与宽字符读取文件
  6. angular2 localStorage的使用
  7. Django自定义分页、bottle、Flask
  8. Qt——消息对话框的设计
  9. zoj 1409 Communication System
  10. 【转】关于浮点数的精度与取值范围的问题