| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 数据结构与算法 -> 贪心算法总结 -> 正文阅读 |
|
[数据结构与算法]贪心算法总结 |
顾名思义,贪心算法或贪心思想采用贪心的策略,保证每次操作都是局部最优的,从而使最
后得到的结果是全局最优的。(题源:力扣)
目录 435. Non-overlapping Intervals (Medium)——区间问题 452. Minimum Number of Arrows to Burst Balloons (Medium) 763. Partition Labels (Medium) 122. Best Time to Buy and Sell Stock II (Easy) 406. Queue Reconstruction by Height (Medium)——最难的 665. Non-decreasing Array (Easy) 455. Assign Cookies (Easy)
题目描述
有一群孩子和一堆饼干,每个孩子有一个饥饿度,每个饼干都有一个大小。每个孩子只能吃
最多一个饼干,且只有饼干的大小大于孩子的饥饿度时,这个孩子才能吃饱。求解最多有多少孩
子可以吃饱。
输入输出样例
输入两个数组,分别代表孩子的饥饿度和饼干的大小。输出最多有多少孩子可以吃饱的数
量。
Input: [1,2], [1,2,3]
Output: 2
在这个样例中,我们可以给两个孩子喂
[1,2]
、
[1,3]
、
[2,3]
这三种组合的任意一种
思路: 这题很简单,利用贪心,就是每次都让最小饥饿度的孩子去吃大小最小(但能满足)的饼干,孩子和饼干数组有这样一种对应关系,所以一说到对应关系和最小这种词,就想到要排序,先对两个数组排序,然后一一对应:
注意这里while的结束条件。
135. Candy (Hard)
题目描述
一群孩子站成一排,每一个孩子有自己的评分。现在需要给这些孩子发糖果,规则是如果一
个孩子的评分比自己身旁的一个孩子要高,那么这个孩子就必须得到比身旁孩子更多的糖果;所
有孩子至少要有一个糖果。求解最少需要多少个糖果。
输入输出样例
输入是一个数组,表示孩子的评分。输出是最少糖果的数量。
Input: [1,0,2]
Output: 5
在这个样例中,最少的糖果分法是
[2,1,2]
。
思路:这里的任意取一个孩子,他的分数和身边人相比,无非就是左边或者右边,并且对于这一个孩子来说左边右边是独立无关联的,所以可以直接先从左往右调整计算,再从右往左即可
?
435. Non-overlapping Intervals (Medium)——区间问题
题目描述
给定多个区间,计算让这些区间互不重叠所需要移除区间的最少个数。起止相连不算重叠。
输入输出样例
输入是一个数组,数组由多个长度固定为
2
的数组组成,表示区间的开始和结尾。输出一个
整数,表示需要移除的区间数量。
Input: [[1,2], [2,4], [1,3]]
Output: 1
在这个样例中,我们可以移除区间
[1,3]
,使得剩余的区间
[[1,2], [2,4]]
互不重叠。
605.种花问题防御式编程思想:在 flowerbed 数组两端各增加一个 0, 这样处理的好处在于不用考虑边界条件,任意位置处只要连续出现三个 0 就可以栽上一棵花。太强了!!
452. Minimum Number of Arrows to Burst Balloons (Medium)?思路: 如图 1-1 所示,我们随机射出一支箭,引爆了除红色气球以外的所有气球。我们称所有引爆的气球为「原本引爆的气球」,其余的气球为「原本完好的气球」。可以发现,如果我们将这支箭的射出位置稍微往右移动一点,那么我们就有机会引爆红色气球,如图 1-2 所示。 那么我们最远可以将这支箭往右移动多远呢?我们唯一的要求就是:原本引爆的气球只要仍然被引爆就行了。这样一来,我们找出原本引爆的气球中右边界位置最靠左的那一个,将这支箭的射出位置移动到这个右边界位置,这也是最远可以往右移动到的位置:如图 1-3 所示,只要我们再往右移动一点点,这个气球就无法被引爆了。 为什么「原本引爆的气球仍然被引爆」是唯一的要求?别急,往下看就能看到其精妙所在。 因此,我们可以断定: 一定存在一种最优(射出的箭数最小)的方法,使得每一支箭的射出位置都恰好对应着某一个气球的右边界。 这是为什么?我们考虑任意一种最优的方法,对于其中的任意一支箭,我们都通过上面描述的方法,将这支箭的位置移动到它对应的「原本引爆的气球中最靠左的右边界位置」,那么这些原本引爆的气球仍然被引爆。这样一来,所有的气球仍然都会被引爆,并且每一支箭的射出位置都恰好位于某一个气球的右边界了。 有了这样一个有用的断定,我们就可以快速得到一种最优的方法了。考虑所有气球中右边界位置最靠左的那一个,那么一定有一支箭的射出位置就是它的右边界(否则就没有箭可以将其引爆了)。当我们确定了一支箭之后,我们就可以将这支箭引爆的所有气球移除,并从剩下未被引爆的气球中,再选择右边界位置最靠左的那一个,确定下一支箭,直到所有的气球都被引爆。 注意: ?!!!!排序加贪心很重要,那个If判断实在太牛了,把上面的红字均实现了
763. Partition Labels (Medium)?难点就是在i=end(访问到end时)的意义是什么,就是这个片段结束,这得好好想想。
上述做法使用贪心的思想寻找每个片段可能的最小结束下标,因此可以保证每个片段的长度一定是符合要求的最短长度,如果取更短的片段,则一定会出现同一个字母出现在多个片段中的情况。
由于每次取的片段都是符合要求的最短的片段,因此得到的片段数也是最多的。由于每个片段访问结束的标志是访问到下标 end,因此对于每个片段,可以保证当前片段中的每个字母都一定在当前片段中,不可能出现在其他片段,可以保证同一个字母只会出现在同一个片段。 122. Best Time to Buy and Sell Stock II (Easy)
这题我想复杂了
?思路:
这题还可以动态规划,到时再说
406. Queue Reconstruction by Height (Medium)——最难的
?PS:插入操作向量太慢了,最好用链表。 665. Non-decreasing Array (Easy)思路:
这里重点提一下我思路,我的思路是往后查,也就是看i i+1 i+2,但这个为什么没有上面看前面的好,我这里记录一下。
先来看我一开始错误的提交(320/355基本对,但是错了一点样例)
?乍一看也很对,和上面正确代码无非就差个2嘛,几乎一模一样,但是,请注意: 我们现在会改变什么?有哪几个赋值语句? 有两个,一个是nums[i] = nums[i + 1];一个是nums[i + 1] = nums[i]; 那么问题来了,nums[i]在这一次循环后,i++我们是不是就不会再去判断或者操作它了呀,这就导致一个严重的后果,你之前判断中用到的是原来的nums[i] ,而你现在却改变了,并且之后不会做任何判断和操作了,那就潜在地或者说肯定地,会导致前面的判断失效,无法得出正确结果。 这里你可以代入3 4 2 3看看,这个是不行的。而上面那个为什么行,因为他改的Nums[i] nums[i-1]之后一次循环i+1-2=i-1,这意味着会继续做判断,你可以控制它,所以是可以的。 那么就要改进代码,对我上面说的改一下:
?好,今日结束 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/25 23:32:23- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |