This commit is contained in:
youngyangyang04
2020-11-24 08:37:52 +08:00
parent b9e475c43c
commit e08fd0eea7
18 changed files with 232 additions and 42 deletions

View File

@ -12,11 +12,12 @@
![算法面试知识大纲](https://img-blog.csdnimg.cn/20200729181420491.png)
# 算法视频讲解
# B站算法视频讲解
* [KMP算法理论篇B站视频](https://www.bilibili.com/video/BV1PD4y1o7nd)
* [KMP算法代码篇B站视频](https://www.bilibili.com/video/BV1M5411j7Xx)
* [回溯算法(理论篇)B站视频](https://www.bilibili.com/video/BV1cy4y167mM)
* [KMP算法理论篇](https://www.bilibili.com/video/BV1PD4y1o7nd)
* [KMP算法代码篇](https://www.bilibili.com/video/BV1M5411j7Xx)
* [回溯算法(理论篇)](https://www.bilibili.com/video/BV1cy4y167mM)
* [回溯算法之组合问题力扣题目77.组合)](https://www.bilibili.com/video/BV1ti4y1L7cv)
(持续更新中....
@ -417,6 +418,7 @@
|[0434.字符串中的单词数](https://github.com/youngyangyang04/leetcode/blob/master/problems/0434.字符串中的单词数.md) |字符串 |简单|**模拟**|
|[0435.无重叠区间](https://github.com/youngyangyang04/leetcode/blob/master/problems/0435.无重叠区间.md) |贪心 |中等|**贪心** 经典题目,有点难|
|[0450.删除二叉搜索树中的节点](https://github.com/youngyangyang04/leetcode/blob/master/problems/0450.删除二叉搜索树中的节点.md) |树 |中等|**递归**|
|[0452.用最少数量的箭引爆气球](https://github.com/youngyangyang04/leetcode/blob/master/problems/0452.用最少数量的箭引爆气球.md) |贪心/排序 |中等|**贪心** 经典题目|
|[0454.四数相加II](https://github.com/youngyangyang04/leetcode/blob/master/problems/0454.四数相加II.md) |哈希表 |中等| **哈希**|
|[0455.分发饼干](https://github.com/youngyangyang04/leetcode/blob/master/problems/0455.分发饼干.md) |贪心 |简单| **贪心**|
|[0459.重复的子字符串](https://github.com/youngyangyang04/leetcode/blob/master/problems/0459.重复的子字符串.md) |字符创 |简单| **KMP**|
@ -454,6 +456,7 @@
|[0977.有序数组的平方](https://github.com/youngyangyang04/leetcode/blob/master/problems/0977.有序数组的平方.md) |数组 |中等|**双指针** 还是比较巧妙的|
|[1002.查找常用字符](https://github.com/youngyangyang04/leetcode/blob/master/problems/1002.查找常用字符.md) |栈 |简单|**栈**|
|[1047.删除字符串中的所有相邻重复项](https://github.com/youngyangyang04/leetcode/blob/master/problems/1047.删除字符串中的所有相邻重复项.md) |哈希表 |简单|**哈希表/数组**|
|[1049.最后一块石头的重量II](https://github.com/youngyangyang04/leetcode/blob/master/problems/1049.最后一块石头的重量II.md) |动态规划 |中等|**01背包**|
|[1207.独一无二的出现次数](https://github.com/youngyangyang04/leetcode/blob/master/problems/1207.独一无二的出现次数.md) |哈希表 |简单|**哈希** 两层哈希|
|[1356.根据数字二进制下1的数目排序](https://github.com/youngyangyang04/leetcode/blob/master/problems/1356.根据数字二进制下1的数目排序.md) |位运算 |简单|**位运算** 巧妙的计算二进制中1的数量|
|[1365.有多少小于当前数字的数字](https://github.com/youngyangyang04/leetcode/blob/master/problems/1365.有多少小于当前数字的数字.md) |数组、哈希表 |简单|**哈希** 从后遍历的技巧很不错|

Binary file not shown.

After

Width:  |  Height:  |  Size: 51 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 34 KiB

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 43 KiB

View File

@ -1,7 +1,4 @@
## 题目地址
https://leetcode-cn.com/problems/letter-combinations-of-a-phone-number/
> 多个集合求组合问题。
# 17.电话号码的字母组合
@ -60,7 +57,7 @@ const string letterMap[10] = {
例如:输入:"23",抽象为树形结构,如图所示:
<img src='../pics/17. 电话号码的字母组合.png' width=600> </img></div>
![17. 电话号码的字母组合](https://img-blog.csdnimg.cn/20201123200304469.png)
图中可以看出遍历的深度,就是输入"23"的长度,而叶子节点就是我们要收集的结果,输出["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"]。
@ -232,4 +229,7 @@ public:
**就酱如果学到了就帮Carl转发一波吧让更多小伙伴知道这里**
> 更多算法干货文章持续更新可以微信搜索「代码随想录」第一时间围观关注后回复「Java」「C++」 「python」「简历模板」「数据结构与算法」等等就可以获得我多年整理的学习资料。
> **我是[程序员Carl](https://github.com/youngyangyang04),可以找我[组队刷题](https://img-blog.csdnimg.cn/20201115103410182.png),也可以在[B站上找到我](https://space.bilibili.com/525438321),本文[leetcode刷题攻略](https://github.com/youngyangyang04/leetcode-master)已收录,更多[精彩算法文章](https://mp.weixin.qq.com/mp/appmsgalbum?__biz=MzUxNjY5NTYxNA==&action=getalbum&album_id=1485825793120387074&scene=173#wechat_redirect)尽在公众号:[代码随想录](https://img-blog.csdnimg.cn/20200815195519696.png),关注后就会发现和「代码随想录」相见恨晚!**
**如果感觉对你有帮助,不要吝啬给一个👍吧!**

View File

@ -112,5 +112,7 @@ public:
};
```
拓展: 也可以一个指向前面一个指向后面遇到需要删除的就交换最后返回指针的位置加1只不过这么做更改了数组元素的位置了不算是移除元素。
> 更多算法干货文章持续更新可以微信搜索「代码随想录」第一时间围观关注后回复「Java」「C++」 「python」「简历模板」「数据结构与算法」等等就可以获得我多年整理的学习资料。

View File

@ -39,7 +39,7 @@ candidates 中的数字可以无限制重复被选取。
本题搜索的过程抽象成树形结构如下:
<img src='../pics/39.组合总和.png' width=600> </img></div>
![39.组合总和](https://img-blog.csdnimg.cn/20201123202227835.png)
注意图中叶子节点的返回条件因为本题没有组合数量要求仅仅是总和的限制所以递归没有层数的限制只要选取的元素总和超过target就返回
@ -75,7 +75,7 @@ void backtracking(vector<int>& candidates, int target, int sum, int startIndex)
在如下树形结构中:
<img src='../pics/39.组合总和.png' width=600> </img></div>
![39.组合总和](https://img-blog.csdnimg.cn/20201123202227835.png)
从叶子节点可以清晰看到终止只有两种情况sum大于target和sum等于target。
@ -148,7 +148,7 @@ public:
在这个树形结构中:
<img src='../pics/39.组合总和.png' width=600> </img></div>
![39.组合总和](https://img-blog.csdnimg.cn/20201123202227835.png)
以及上面的版本一的代码大家可以看到对于sum已经大于target的情况其实是依然进入了下一层递归只是下一层递归结束判断的时候会判断sum > target的话就返回。
@ -160,7 +160,7 @@ public:
如图:
<img src='../pics/39.组合总和1.png' width=600> </img></div>
![39.组合总和1](https://img-blog.csdnimg.cn/20201123202349897.png)
for循环剪枝代码如下
@ -222,3 +222,7 @@ public:
**就酱如果感觉很给力就帮Carl宣传一波吧哈哈**
> **我是[程序员Carl](https://github.com/youngyangyang04),可以找我[组队刷题](https://img-blog.csdnimg.cn/20201115103410182.png),也可以在[B站上找到我](https://space.bilibili.com/525438321),本文[leetcode刷题攻略](https://github.com/youngyangyang04/leetcode-master)已收录,更多[精彩算法文章](https://mp.weixin.qq.com/mp/appmsgalbum?__biz=MzUxNjY5NTYxNA==&action=getalbum&album_id=1485825793120387074&scene=173#wechat_redirect)尽在公众号:[代码随想录](https://img-blog.csdnimg.cn/20200815195519696.png),关注后就会发现和「代码随想录」相见恨晚!**
**如果感觉对你有帮助,不要吝啬给一个👍吧!**

View File

@ -1,6 +1,5 @@
> 这篇可以说是全网把组合问题如何去重,讲的最清晰的了!
# 40.组合总和II
题目链接https://leetcode-cn.com/problems/combination-sum-ii/
@ -65,7 +64,7 @@ candidates 中的每个数字在每个组合中只能使用一次。
选择过程树形结构如图所示:
<img src='../pics/40.组合总和II.png' width=600> </img></div>
![40.组合总和II](https://img-blog.csdnimg.cn/20201123202736384.png)
可以看到图中,每个节点相对于 [39.组合总和](https://mp.weixin.qq.com/s/FLg8G6EjVcxBjwCbzpACPw)我多加了used数组这个used数组下面会重点介绍。
@ -115,7 +114,7 @@ if (sum == target) {
这块比较抽象,如图:
<img src='../pics/40.组合总和II1.png' width=600> </img></div>
![40.组合总和II1](https://img-blog.csdnimg.cn/20201123202817973.png)
我在图中将used的变化用橘黄色标注上可以看出在candidates[i] == candidates[i - 1]相同的情况下:
@ -201,4 +200,7 @@ public:
**就酱如果感觉「代码随想录」诚意满满就帮Carl宣传一波吧感谢啦**
> **我是[程序员Carl](https://github.com/youngyangyang04),可以找我[组队刷题](https://img-blog.csdnimg.cn/20201115103410182.png),也可以在[B站上找到我](https://space.bilibili.com/525438321),本文[leetcode刷题攻略](https://github.com/youngyangyang04/leetcode-master)已收录,更多[精彩算法文章](https://mp.weixin.qq.com/mp/appmsgalbum?__biz=MzUxNjY5NTYxNA==&action=getalbum&album_id=1485825793120387074&scene=173#wechat_redirect)尽在公众号:[代码随想录](https://img-blog.csdnimg.cn/20200815195519696.png),关注后就会发现和「代码随想录」相见恨晚!**
**如果感觉对你有帮助,不要吝啬给一个👍吧!**

View File

@ -75,7 +75,7 @@ for (int i = 1; i <= n; i++) {
那么我把组合问题抽象为如下树形结构:
<img src='../pics/77.组合.png' width=600> </img></div>
![77.组合](https://img-blog.csdnimg.cn/20201123195223940.png)
可以看出这个棵树,一开始集合是 1234 从左向右取数,取过的数,不在重复取。
@ -119,7 +119,7 @@ vector<int> path; // 用来存放符合条件结果
从下图中红线部分可以看出,在集合[1,2,3,4]取1之后下一层递归就要在[2,3,4]中取数了,那么下一层递归如何知道从[2,3,4]中取数呢靠的就是startIndex。
<img src='../pics/77.组合2.png' width=600> </img></div>
![77.组合2](https://img-blog.csdnimg.cn/20201123195328976.png)
所以需要startIndex来记录下一层递归搜索的起始位置。
@ -139,7 +139,7 @@ path这个数组的大小如果达到k说明我们找到了一个子集大小
如图红色部分:
<img src='../pics/77.组合3.png' width=600> </img></div>
![77.组合3](https://img-blog.csdnimg.cn/20201123195407907.png)
此时用result二维数组把path保存起来并终止本层递归。
@ -156,7 +156,7 @@ if (path.size() == k) {
回溯法的搜索过程就是一个树型结构的遍历过程在如下图中可以看出for循环用来横向遍历递归的过程是纵向遍历。
<img src='../pics/77.组合1.png' width=600> </img></div>
![77.组合1](https://img-blog.csdnimg.cn/20201123195242899.png)
如此我们才遍历完图中的这棵树。
@ -241,3 +241,8 @@ void backtracking(参数) {
**[本题剪枝操作文章链接](https://mp.weixin.qq.com/s/Ri7spcJMUmph4c6XjPWXQA)**
> **我是[程序员Carl](https://github.com/youngyangyang04),可以找我[组队刷题](https://img-blog.csdnimg.cn/20201115103410182.png),也可以在[B站上找到我](https://space.bilibili.com/525438321),本文[leetcode刷题攻略](https://github.com/youngyangyang04/leetcode-master)已收录,更多[精彩算法文章](https://mp.weixin.qq.com/mp/appmsgalbum?__biz=MzUxNjY5NTYxNA==&action=getalbum&album_id=1485825793120387074&scene=173#wechat_redirect)尽在公众号:[代码随想录](https://img-blog.csdnimg.cn/20200815195519696.png),关注后就会发现和「代码随想录」相见恨晚!**
**如果感觉对你有帮助,不要吝啬给一个👍吧!**

View File

@ -38,7 +38,7 @@
以示例中nums = [1,2,3]为例把求子集抽象为树型结构,如下:
<img src='../pics/78.子集.png' width=600> </img></div>
![78.子集](https://img-blog.csdnimg.cn/202011232041348.png)
从图中红线部分,可以看出**遍历这个树的时候,把所有节点都记录下来,就是要求的子集集合**。
@ -62,7 +62,7 @@ void backtracking(vector<int>& nums, int startIndex) {
从图中可以看出:
<img src='../pics/78.子集.png' width=600> </img></div>
![78.子集](https://img-blog.csdnimg.cn/202011232041348.png)
剩余集合为空的时候,就是叶子节点。
@ -169,3 +169,7 @@ public:
**就酱如果感觉收获满满就帮Carl宣传一波「代码随想录」吧**
> **我是[程序员Carl](https://github.com/youngyangyang04),可以找我[组队刷题](https://img-blog.csdnimg.cn/20201115103410182.png),也可以在[B站上找到我](https://space.bilibili.com/525438321),本文[leetcode刷题攻略](https://github.com/youngyangyang04/leetcode-master)已收录,更多[精彩算法文章](https://mp.weixin.qq.com/mp/appmsgalbum?__biz=MzUxNjY5NTYxNA==&action=getalbum&album_id=1485825793120387074&scene=173#wechat_redirect)尽在公众号:[代码随想录](https://img-blog.csdnimg.cn/20200815195519696.png),关注后就会发现和「代码随想录」相见恨晚!**
**如果感觉对你有帮助,不要吝啬给一个👍吧!**

View File

@ -1,5 +1,3 @@
## 题目地址
> 一些录友表示跟不上现在的节奏,想从头开始打卡学习起来,可以在公众号左下方,「算法汇总」可以找到历史文章,都是按系列排好顺序的,挨个看就可以了,看文章下的留言你就会发现,有很多录友都在从头打卡,你并不孤单!
# 93.复原IP地址
@ -47,7 +45,7 @@ s 仅由数字组成
切割问题可以抽象为树型结构,如图:
<img src='../pics/93.复原IP地址.png' width=600> </img></div>
![93.复原IP地址](https://img-blog.csdnimg.cn/20201123203735933.png)
## 回溯三部曲
@ -98,7 +96,7 @@ if (pointNum == 3) { // 逗点数量为3时分隔结束
如果不合法就结束本层循环,如图中剪掉的分支:
<img src='../pics/93.复原IP地址.png' width=600> </img></div>
![93.复原IP地址](https://img-blog.csdnimg.cn/20201123203735933.png)
然后就是递归和回溯的过程:
@ -249,6 +247,7 @@ public:
**很多录友都在从头开始打卡学习,看看前面文章的留言区就知道了,你并不孤单!**
> **我是[程序员Carl](https://github.com/youngyangyang04),可以找我[组队刷题](https://img-blog.csdnimg.cn/20201115103410182.png),也可以在[B站上找到我](https://space.bilibili.com/525438321),本文[leetcode刷题攻略](https://github.com/youngyangyang04/leetcode-master)已收录,更多[精彩算法文章](https://mp.weixin.qq.com/mp/appmsgalbum?__biz=MzUxNjY5NTYxNA==&action=getalbum&album_id=1485825793120387074&scene=173#wechat_redirect)尽在公众号:[代码随想录](https://img-blog.csdnimg.cn/20200815195519696.png),关注后就会发现和「代码随想录」相见恨晚!**
> 我是[程序员Carl](https://github.com/youngyangyang04),更多[精彩算法文章](https://mp.weixin.qq.com/mp/appmsgalbum?__biz=MzUxNjY5NTYxNA==&action=getalbum&album_id=1485825793120387074&scene=173#wechat_redirect)尽在:[代码随想录](https://img-blog.csdnimg.cn/20200815195519696.png),期待你的关注!
**如果感觉对你有帮助,不要吝啬给一个👍吧!**

View File

@ -42,7 +42,7 @@
所以切割问题,也可以抽象为一颗树形结构,如图:
<img src='../pics/131.分割回文串.png' width=600> </img></div>
![131.分割回文串](https://img-blog.csdnimg.cn/20201123203228309.png)
递归用来纵向遍历for循环用来横向遍历切割线就是图中的红线切割到字符串的结尾位置说明找到了一个切割方法。
@ -68,7 +68,7 @@ void backtracking (const string& s, int startIndex) {
* 递归函数终止条件
<img src='../pics/131.分割回文串.png' width=600> </img></div>
![131.分割回文串](https://img-blog.csdnimg.cn/20201123203228309.png)
从树形结构的图中可以看出:切割线切到了字符串最后面,说明找到了一种切割方法,此时就是本层递归的终止终止条件。
@ -234,5 +234,7 @@ public:
**就酱如果感觉「代码随想录」不错就把Carl宣传一波吧**
> 我是[程序员Carl](https://github.com/youngyangyang04)组队刷题可以找我,本文[leetcode刷题攻略](https://github.com/youngyangyang04/leetcode-master)已收录,更多[精彩算法文章](https://mp.weixin.qq.com/mp/appmsgalbum?__biz=MzUxNjY5NTYxNA==&action=getalbum&album_id=1485825793120387074&scene=173#wechat_redirect)尽在:[代码随想录](https://img-blog.csdnimg.cn/20200815195519696.png)期待你的关注!
> **我是[程序员Carl](https://github.com/youngyangyang04),可以找我[组队刷题](https://img-blog.csdnimg.cn/20201115103410182.png),也可以在[B站上找到我](https://space.bilibili.com/525438321),本文[leetcode刷题攻略](https://github.com/youngyangyang04/leetcode-master)已收录,更多[精彩算法文章](https://mp.weixin.qq.com/mp/appmsgalbum?__biz=MzUxNjY5NTYxNA==&action=getalbum&album_id=1485825793120387074&scene=173#wechat_redirect)尽在公众号[代码随想录](https://img-blog.csdnimg.cn/20200815195519696.png)关注后就会发现和「代码随想录」相见恨晚!**
**如果感觉对你有帮助,不要吝啬给一个👍吧!**

View File

@ -1,5 +1,3 @@
## 链接
https://leetcode-cn.com/problems/combination-sum-iii/
> 别看本篇选的是组合总和III而不是组合总和本题和上一篇[回溯算法:求组合问题!](https://mp.weixin.qq.com/s/OnBjbLzuipWz_u4QfmgcqQ)相比难度刚刚好!
@ -36,7 +34,7 @@ https://leetcode-cn.com/problems/combination-sum-iii/
选取过程如图:
<img src='../pics/216.组合总和III.png' width=600> </img></div>
![216.组合总和III](https://img-blog.csdnimg.cn/20201123195717975.png)
图中可以看出只有最后取到集合13和为4 符合条件。
@ -98,7 +96,7 @@ if (path.size() == k) {
本题和[回溯算法:求组合问题!](https://mp.weixin.qq.com/s/OnBjbLzuipWz_u4QfmgcqQ)区别之一就是集合固定的就是9个数[1,...,9]所以for循环固定i<=9
如图:
<img src='../pics/216.组合总和III.png' width=600> </img></div>
![216.组合总和III](https://img-blog.csdnimg.cn/20201123195717975.png)
处理过程就是 path收集每次选取的元素相当于树型结构里的边sum来统计path里元素的总和。
@ -156,7 +154,7 @@ public:
这道题目,剪枝操作其实是很容易想到了,想必大家看上面的树形图的时候已经想到了。
如图:
<img src='../pics/216.组合总和III1.png' width=600> </img></div>
![216.组合总和III1](https://img-blog.csdnimg.cn/2020112319580476.png)
已选元素总和如果已经大于n图中数值为4那么往后遍历就没有意义了直接剪掉。
@ -213,3 +211,8 @@ public:
相信做完本题,大家对组合问题应该有初步了解了。
**就酱如果感觉对你有帮助就帮Carl转发一下吧让更多小伙伴知道这里**
> **我是[程序员Carl](https://github.com/youngyangyang04),可以找我[组队刷题](https://img-blog.csdnimg.cn/20201115103410182.png),也可以在[B站上找到我](https://space.bilibili.com/525438321),本文[leetcode刷题攻略](https://github.com/youngyangyang04/leetcode-master)已收录,更多[精彩算法文章](https://mp.weixin.qq.com/mp/appmsgalbum?__biz=MzUxNjY5NTYxNA==&action=getalbum&album_id=1485825793120387074&scene=173#wechat_redirect)尽在公众号:[代码随想录](https://img-blog.csdnimg.cn/20200815195519696.png),关注后就会发现和「代码随想录」相见恨晚!**
**如果感觉对你有帮助,不要吝啬给一个👍吧!**

View File

@ -221,6 +221,18 @@ public:
一波分析之后,可以看出我就是按照回溯算法的模板来的。
代码中
```
for (pair<const string, int>& target : targets[result[result.size() - 1]])
```
pair里要有const因为map中的key是不可修改的所以是`pair<const string, int>`
如果不加const也可以复制一份pair例如这么写
```
for (pair<string, int>target : targets[result[result.size() - 1]])
```
# 总结
本题其实可以算是一道hard的题目了关于本题的难点我在文中已经列出了。

View File

@ -0,0 +1,78 @@
# 思路
接下来在想一下如何使用最少的弓箭。
直觉上来看,貌似只射重叠最多的气球,用的弓箭一定最少,那么有没有当前重叠了三个,我射两个,留下一个和后面的一起射这样弓箭用的更少的情况呢?
尝试一下举反例,发现没有这种情况,**那么就试一试贪心吧!**
算法确定下来了,那么如何模拟气球涉爆的过程呢?是在数组中移除元素还是做标记呢?
如果真实的模拟射气球的过程应该射一个气球数组就remove一个元素这样最直观毕竟气球被射了。
但又想一下如果把气球排序之后从前到后遍历气球被射过的气球仅仅跳过就行了没有必要让气球数组remove气球记录一下箭的数量就可以了。
> PS:本文[leetcode刷题攻略](https://github.com/youngyangyang04/leetcode-master)已收录,更多[精彩算法文章](https://mp.weixin.qq.com/mp/appmsgalbum?__biz=MzUxNjY5NTYxNA==&action=getalbum&album_id=1485825793120387074&scene=173#wechat_redirect)尽在公众号:[代码随想录](https://img-blog.csdnimg.cn/20200815195519696.png),关注后就会发现和「代码随想录」相见恨晚!
以上为思考过程,已经确定下来使用贪心了,那么开始解题。
**为了让气球尽可能的重叠,需要对数组进行排序**
那么按照气球起始位置排序,还是按照气球终止位置排序呢?
其实都可以!只不过对应的遍历顺序不同,我就按照气球的起始位置排序了。
既然按照其实位置排序,那么就从前向后遍历气球数组,靠左尽可能让气球重复。
从前向后遍历遇到重叠的气球了怎么办?
如果气球重叠了,重叠气球中右边边界的最小值 之前的区间一定需要一个弓箭。
以题目示例: [[10,16],[2,8],[1,6],[7,12]]为例,如图:(方便起见,已经排序)
![452.用最少数量的箭引爆气球](https://img-blog.csdnimg.cn/20201123101929791.png)
可以看出首先第一组重叠气球一定是需要一个箭气球3的左边界大于了 第一组重叠气球的最小右边界所以再需要一支箭来射气球3了。
C++代码如下:
```C++
class Solution {
private:
static bool cmp(const vector<int>& a, const vector<int>& b) {
return a[0] < b[0];
}
public:
int findMinArrowShots(vector<vector<int>>& points) {
if (points.size() == 0) return 0;
sort(points.begin(), points.end(), cmp);
int result = 1; // points 不为空至少需要一支箭
for (int i = 1; i < points.size(); i++) {
if (points[i][0] > points[i - 1][1]) { // 气球i和气球i-1不挨着注意这里不是>=
result++; // 需要一支箭
}
else { // 气球i和气球i-1挨着
points[i][1] = min(points[i - 1][1], points[i][1]); // 更新重叠气球最小右边界
}
}
return result;
}
};
```
时间复杂度O(nlogn)
空间复杂度O(1)
# 注意事项
注意题目中说的是:满足 xstart ≤ x ≤ xend则该气球会被引爆。那么说明两个气球挨在一起不重叠也可以一起射爆
所以代码中 `if (points[i][0] > points[i - 1][1])` 不能是>=
> **我是[程序员Carl](https://github.com/youngyangyang04),可以找我[组队刷题](https://img-blog.csdnimg.cn/20201115103410182.png),也可以在[B站上找到我](https://space.bilibili.com/525438321),本文[leetcode刷题攻略](https://github.com/youngyangyang04/leetcode-master)已收录,更多[精彩算法文章](https://mp.weixin.qq.com/mp/appmsgalbum?__biz=MzUxNjY5NTYxNA==&action=getalbum&album_id=1485825793120387074&scene=173#wechat_redirect)尽在公众号:[代码随想录](https://img-blog.csdnimg.cn/20200815195519696.png),关注后就会发现和「代码随想录」相见恨晚!**
**如果感觉题解对你有帮助,不要吝啬给一个👍吧!**

View File

@ -1,26 +1,62 @@
> 贪心的第一道题目,快看看你够不够贪心
## 链接
通知一些录友表示经常看不到每天的文章现在公众号已经不按照发送时间推荐了而是根据一些规则乱序推送所以可能关注了「代码随想录」也一直看不到文章建议把「代码随想录」设置星标哈设置星标之后每天就按发文时间推送了我每天都是定时8:35发送的嗷嗷准时
# 455.分发饼干
题目链接https://leetcode-cn.com/problems/assign-cookies/
假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。
对每个孩子 i都有一个胃口值 g[i],这是能让孩子们满足胃口的饼干的最小尺寸;并且每块饼干 j都有一个尺寸 s[j] 。如果 s[j] >= g[i],我们可以将这个饼干 j 分配给孩子 i ,这个孩子会得到满足。你的目标是尽可能满足越多数量的孩子,并输出这个最大数值。
示例 1:
输入: g = [1,2,3], s = [1,1]
输出: 1
解释:
你有三个孩子和两块小饼干3个孩子的胃口值分别是1,2,3。
虽然你有两块小饼干由于他们的尺寸都是1你只能让胃口值是1的孩子满足。
所以你应该输出1。
示例 2:
输入: g = [1,2], s = [1,2,3]
输出: 2
解释:
你有两个孩子和三块小饼干2个孩子的胃口值分别是1,2。
你拥有的饼干数量和尺寸都足以让所有孩子满足。
所以你应该输出2.
 
提示:
* 1 <= g.length <= 3 * 104
* 0 <= s.length <= 3 * 104
* 1 <= g[i], s[j] <= 231 - 1
https://leetcode-cn.com/problems/assign-cookies/
## 思路
这道题目呢,其实可以用较大大的饼干优先满足可以满足的胃口大的小孩
为了了满足更多的小孩,就不要造成饼干尺寸的浪费
注意我这里用的是 可以满足胃口大的小孩。这样就不会造成大饼干的浪费
大尺寸的饼干既可以满足胃口大的孩子也可以满足胃口小的孩子,那么就应该优先满足胃口大的
所以使用贪心策略,讲饼干数组和小孩数组排序
**这里的局部最优就是大饼干喂给胃口大的,充分利用饼干尺寸喂饱一个,全局最优就是喂饱尽可能多的小孩**
然后从后向前遍历小孩数组,用大饼干优先满足胃口大的,并统计满足小孩数量的大小就可以了
可以尝试使用贪心策略,先将饼干数组和小孩数组排序
然后从后向前遍历小孩数组,用大饼干优先满足胃口大的,并统计满足小孩数量。
如图:
<img src='../pics/455.分发饼干.png' width=600> </img></div>
![455.分发饼干](https://img-blog.csdnimg.cn/20201123161809624.png)
这个例子可以看出饼干9只有喂给胃口为7的小孩这样才是整体最优解并想不出反例那么就可以撸代码了。
C++代码整体如下:
```
// 时间复杂度O(nlogn)
// 空间复杂度O(1)
class Solution {
public:
int findContentChildren(vector<int>& g, vector<int>& s) {
@ -38,5 +74,18 @@ public:
}
};
```
从代码中可以看出我用了一个index来控制饼干数组的遍历遍历饼干并没有再起一个for循环而是采用自减的方式这也是常用的技巧。
有的同学看到要遍历两个数组就想到用两个for循环那样逻辑其实就复杂了。
# 总结
这道题是贪心很好的一道入门题目,思路还是比较容易想到的。
文中详细介绍了思考的过程,**想清楚局部最优,想清楚全局最优,感觉局部最优是可以推出全局最优,并想不出反例,那么就试一试贪心**。
就酱,「代码随想录」值得介绍给身边的朋友同学们!
> 我是[程序员Carl](https://github.com/youngyangyang04),组队刷题可以找我,本文[leetcode刷题攻略](https://github.com/youngyangyang04/leetcode-master)已收录,更多[精彩算法文章](https://mp.weixin.qq.com/mp/appmsgalbum?__biz=MzUxNjY5NTYxNA==&action=getalbum&album_id=1485825793120387074&scene=173#wechat_redirect)尽在:[代码随想录](https://img-blog.csdnimg.cn/20200815195519696.png),期待你的关注!

View File

@ -0,0 +1,24 @@
// 如何转化为01背包问题
尽量让石头分成,重量相同的两堆,这样就化解成 01背包问题了。
```
class Solution {
public:
int lastStoneWeightII(vector<int>& stones) {
vector<int> dp(30001, 0);
int sum = 0;
for (int i = 0; i < stones.size(); i++) sum += stones[i];
int target = sum / 2;
for (int i = 0; i < stones.size(); i++) {
for (int j = target; j >= 0; j--) {
if (j - stones[i] >= 0) {
dp[j] = max(dp[j], dp[j - stones[i]] + stones[i]);
}
}
}
return sum - dp[target] - dp[target];
}
};
```

View File

@ -154,4 +154,7 @@ void backtracking(参数) {
今天是回溯算法的第一天按照惯例Carl都是先概述一波然后在开始讲解具体题目没有接触过回溯法的同学刚学起来有点看不懂很正常后面和具体题目结合起来会好一些。
> **我是[程序员Carl](https://github.com/youngyangyang04),可以找我[组队刷题](https://img-blog.csdnimg.cn/20201115103410182.png),也可以在[B站上找到我](https://space.bilibili.com/525438321),本文[leetcode刷题攻略](https://github.com/youngyangyang04/leetcode-master)已收录,更多[精彩算法文章](https://mp.weixin.qq.com/mp/appmsgalbum?__biz=MzUxNjY5NTYxNA==&action=getalbum&album_id=1485825793120387074&scene=173#wechat_redirect)尽在公众号:[代码随想录](https://img-blog.csdnimg.cn/20200815195519696.png),关注后就会发现和「代码随想录」相见恨晚!**
**如果感觉对你有帮助,不要吝啬给一个👍吧!**