mirror of
https://github.com/youngyangyang04/leetcode-master.git
synced 2025-07-08 16:54:50 +08:00
Merge branch 'youngyangyang04:master' into master
This commit is contained in:
@ -13,7 +13,7 @@
|
|||||||
|
|
||||||
# 150. 逆波兰表达式求值
|
# 150. 逆波兰表达式求值
|
||||||
|
|
||||||
https://leetcode-cn.com/problems/evaluate-reverse-polish-notation/
|
[力扣题目链接](https://leetcode-cn.com/problems/evaluate-reverse-polish-notation/)
|
||||||
|
|
||||||
根据 逆波兰表示法,求表达式的值。
|
根据 逆波兰表示法,求表达式的值。
|
||||||
|
|
||||||
@ -23,7 +23,7 @@ https://leetcode-cn.com/problems/evaluate-reverse-polish-notation/
|
|||||||
|
|
||||||
整数除法只保留整数部分。
|
整数除法只保留整数部分。
|
||||||
给定逆波兰表达式总是有效的。换句话说,表达式总会得出有效数值且不存在除数为 0 的情况。
|
给定逆波兰表达式总是有效的。换句话说,表达式总会得出有效数值且不存在除数为 0 的情况。
|
||||||
|
|
||||||
|
|
||||||
示例 1:
|
示例 1:
|
||||||
* 输入: ["2", "1", "+", "3", " * "]
|
* 输入: ["2", "1", "+", "3", " * "]
|
||||||
@ -37,16 +37,21 @@ https://leetcode-cn.com/problems/evaluate-reverse-polish-notation/
|
|||||||
|
|
||||||
示例 3:
|
示例 3:
|
||||||
* 输入: ["10", "6", "9", "3", "+", "-11", " * ", "/", " * ", "17", "+", "5", "+"]
|
* 输入: ["10", "6", "9", "3", "+", "-11", " * ", "/", " * ", "17", "+", "5", "+"]
|
||||||
|
|
||||||
* 输出: 22
|
* 输出: 22
|
||||||
|
|
||||||
* 解释:该算式转化为常见的中缀算术表达式为:
|
* 解释:该算式转化为常见的中缀算术表达式为:
|
||||||
|
|
||||||
|
```
|
||||||
((10 * (6 / ((9 + 3) * -11))) + 17) + 5
|
((10 * (6 / ((9 + 3) * -11))) + 17) + 5
|
||||||
= ((10 * (6 / (12 * -11))) + 17) + 5
|
= ((10 * (6 / (12 * -11))) + 17) + 5
|
||||||
= ((10 * (6 / -132)) + 17) + 5
|
= ((10 * (6 / -132)) + 17) + 5
|
||||||
= ((10 * 0) + 17) + 5
|
= ((10 * 0) + 17) + 5
|
||||||
= (0 + 17) + 5
|
= (0 + 17) + 5
|
||||||
= 17 + 5
|
= 17 + 5
|
||||||
= 22
|
= 22
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
逆波兰表达式:是一种后缀表达式,所谓后缀就是指算符写在后面。
|
逆波兰表达式:是一种后缀表达式,所谓后缀就是指算符写在后面。
|
||||||
|
|
||||||
@ -62,7 +67,7 @@ https://leetcode-cn.com/problems/evaluate-reverse-polish-notation/
|
|||||||
|
|
||||||
# 思路
|
# 思路
|
||||||
|
|
||||||
在上一篇文章中[1047.删除字符串中的所有相邻重复项](https://mp.weixin.qq.com/s/1-x6r1wGA9mqIHW5LrMvBg)提到了 递归就是用栈来实现的。
|
在上一篇文章中[1047.删除字符串中的所有相邻重复项](https://programmercarl.com/1047.删除字符串中的所有相邻重复项.html)提到了 递归就是用栈来实现的。
|
||||||
|
|
||||||
所以**栈与递归之间在某种程度上是可以转换的!** 这一点我们在后续讲解二叉树的时候,会更详细的讲解到。
|
所以**栈与递归之间在某种程度上是可以转换的!** 这一点我们在后续讲解二叉树的时候,会更详细的讲解到。
|
||||||
|
|
||||||
@ -70,12 +75,12 @@ https://leetcode-cn.com/problems/evaluate-reverse-polish-notation/
|
|||||||
|
|
||||||
但我们没有必要从二叉树的角度去解决这个问题,只要知道逆波兰表达式是用后续遍历的方式把二叉树序列化了,就可以了。
|
但我们没有必要从二叉树的角度去解决这个问题,只要知道逆波兰表达式是用后续遍历的方式把二叉树序列化了,就可以了。
|
||||||
|
|
||||||
在进一步看,本题中每一个子表达式要得出一个结果,然后拿这个结果再进行运算,那么**这岂不就是一个相邻字符串消除的过程,和[1047.删除字符串中的所有相邻重复项](https://mp.weixin.qq.com/s/1-x6r1wGA9mqIHW5LrMvBg)中的对对碰游戏是不是就非常像了。**
|
在进一步看,本题中每一个子表达式要得出一个结果,然后拿这个结果再进行运算,那么**这岂不就是一个相邻字符串消除的过程,和[1047.删除字符串中的所有相邻重复项](https://programmercarl.com/1047.删除字符串中的所有相邻重复项.html)中的对对碰游戏是不是就非常像了。**
|
||||||
|
|
||||||
如动画所示:
|
如动画所示:
|
||||||

|

|
||||||
|
|
||||||
相信看完动画大家应该知道,这和[1047. 删除字符串中的所有相邻重复项](https://mp.weixin.qq.com/s/1-x6r1wGA9mqIHW5LrMvBg)是差不错的,只不过本题不要相邻元素做消除了,而是做运算!
|
相信看完动画大家应该知道,这和[1047. 删除字符串中的所有相邻重复项](https://programmercarl.com/1047.删除字符串中的所有相邻重复项.html)是差不错的,只不过本题不要相邻元素做消除了,而是做运算!
|
||||||
|
|
||||||
C++代码如下:
|
C++代码如下:
|
||||||
|
|
||||||
|
@ -12,7 +12,7 @@
|
|||||||
|
|
||||||
# 225. 用队列实现栈
|
# 225. 用队列实现栈
|
||||||
|
|
||||||
https://leetcode-cn.com/problems/implement-stack-using-queues/
|
[力扣题目链接](https://leetcode-cn.com/problems/implement-stack-using-queues/)
|
||||||
|
|
||||||
使用队列实现栈的下列操作:
|
使用队列实现栈的下列操作:
|
||||||
|
|
||||||
@ -34,7 +34,7 @@ https://leetcode-cn.com/problems/implement-stack-using-queues/
|
|||||||
|
|
||||||
有的同学可能疑惑这种题目有什么实际工程意义,**其实很多算法题目主要是对知识点的考察和教学意义远大于其工程实践的意义,所以面试题也是这样!**
|
有的同学可能疑惑这种题目有什么实际工程意义,**其实很多算法题目主要是对知识点的考察和教学意义远大于其工程实践的意义,所以面试题也是这样!**
|
||||||
|
|
||||||
刚刚做过[栈与队列:我用栈来实现队列怎么样?](https://mp.weixin.qq.com/s/Cj6R0qu8rFA7Et9V_ZMjCA)的同学可能依然想着用一个输入队列,一个输出队列,就可以模拟栈的功能,仔细想一下还真不行!
|
刚刚做过[栈与队列:我用栈来实现队列怎么样?](https://programmercarl.com/0232.用栈实现队列.html)的同学可能依然想着用一个输入队列,一个输出队列,就可以模拟栈的功能,仔细想一下还真不行!
|
||||||
|
|
||||||
**队列模拟栈,其实一个队列就够了**,那么我们先说一说两个队列来实现栈的思路。
|
**队列模拟栈,其实一个队列就够了**,那么我们先说一说两个队列来实现栈的思路。
|
||||||
|
|
||||||
|
@ -11,7 +11,7 @@
|
|||||||
|
|
||||||
# 232.用栈实现队列
|
# 232.用栈实现队列
|
||||||
|
|
||||||
https://leetcode-cn.com/problems/implement-queue-using-stacks/
|
[力扣题目链接](https://leetcode-cn.com/problems/implement-queue-using-stacks/)
|
||||||
|
|
||||||
使用栈实现队列的下列操作:
|
使用栈实现队列的下列操作:
|
||||||
|
|
||||||
|
@ -9,7 +9,7 @@
|
|||||||
|
|
||||||
## 279.完全平方数
|
## 279.完全平方数
|
||||||
|
|
||||||
题目地址:https://leetcode-cn.com/problems/perfect-squares/
|
[力扣题目链接](https://leetcode-cn.com/problems/perfect-squares/)
|
||||||
|
|
||||||
给定正整数 n,找到若干个完全平方数(比如 1, 4, 9, 16, ...)使得它们的和等于 n。你需要让组成和的完全平方数的个数最少。
|
给定正整数 n,找到若干个完全平方数(比如 1, 4, 9, 16, ...)使得它们的和等于 n。你需要让组成和的完全平方数的个数最少。
|
||||||
|
|
||||||
@ -36,7 +36,7 @@
|
|||||||
|
|
||||||
**我来把题目翻译一下:完全平方数就是物品(可以无限件使用),凑个正整数n就是背包,问凑满这个背包最少有多少物品?**
|
**我来把题目翻译一下:完全平方数就是物品(可以无限件使用),凑个正整数n就是背包,问凑满这个背包最少有多少物品?**
|
||||||
|
|
||||||
感受出来了没,这么浓厚的完全背包氛围,而且和昨天的题目[动态规划:322. 零钱兑换](https://mp.weixin.qq.com/s/dyk-xNilHzNtVdPPLObSeQ)就是一样一样的!
|
感受出来了没,这么浓厚的完全背包氛围,而且和昨天的题目[动态规划:322. 零钱兑换](https://programmercarl.com/0322.零钱兑换.html)就是一样一样的!
|
||||||
|
|
||||||
动规五部曲分析如下:
|
动规五部曲分析如下:
|
||||||
|
|
||||||
@ -70,7 +70,7 @@ dp[0]表示 和为0的完全平方数的最小数量,那么dp[0]一定是0。
|
|||||||
|
|
||||||
如果求排列数就是外层for遍历背包,内层for循环遍历物品。
|
如果求排列数就是外层for遍历背包,内层for循环遍历物品。
|
||||||
|
|
||||||
在[动态规划:322. 零钱兑换](https://mp.weixin.qq.com/s/dyk-xNilHzNtVdPPLObSeQ)中我们就深入探讨了这个问题,本题也是一样的,是求最小数!
|
在[动态规划:322. 零钱兑换](https://programmercarl.com/0322.零钱兑换.html)中我们就深入探讨了这个问题,本题也是一样的,是求最小数!
|
||||||
|
|
||||||
**所以本题外层for遍历背包,里层for遍历物品,还是外层for遍历物品,内层for遍历背包,都是可以的!**
|
**所以本题外层for遍历背包,里层for遍历物品,还是外层for遍历物品,内层for遍历背包,都是可以的!**
|
||||||
|
|
||||||
@ -146,7 +146,7 @@ public:
|
|||||||
|
|
||||||
## 总结
|
## 总结
|
||||||
|
|
||||||
如果大家认真做了昨天的题目[动态规划:322. 零钱兑换](https://mp.weixin.qq.com/s/dyk-xNilHzNtVdPPLObSeQ),今天这道就非常简单了,一样的套路一样的味道。
|
如果大家认真做了昨天的题目[动态规划:322. 零钱兑换](https://programmercarl.com/0322.零钱兑换.html),今天这道就非常简单了,一样的套路一样的味道。
|
||||||
|
|
||||||
但如果没有按照「代码随想录」的题目顺序来做的话,做动态规划或者做背包问题,上来就做这道题,那还是挺难的!
|
但如果没有按照「代码随想录」的题目顺序来做的话,做动态规划或者做背包问题,上来就做这道题,那还是挺难的!
|
||||||
|
|
||||||
|
@ -8,13 +8,13 @@
|
|||||||
|
|
||||||
## 300.最长递增子序列
|
## 300.最长递增子序列
|
||||||
|
|
||||||
题目链接:https://leetcode-cn.com/problems/longest-increasing-subsequence/
|
[力扣题目链接](https://leetcode-cn.com/problems/longest-increasing-subsequence/)
|
||||||
|
|
||||||
给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。
|
给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。
|
||||||
|
|
||||||
子序列是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的子序列。
|
子序列是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的子序列。
|
||||||
|
|
||||||
|
|
||||||
示例 1:
|
示例 1:
|
||||||
输入:nums = [10,9,2,5,3,7,101,18]
|
输入:nums = [10,9,2,5,3,7,101,18]
|
||||||
输出:4
|
输出:4
|
||||||
@ -27,7 +27,7 @@
|
|||||||
示例 3:
|
示例 3:
|
||||||
输入:nums = [7,7,7,7,7,7,7]
|
输入:nums = [7,7,7,7,7,7,7]
|
||||||
输出:1
|
输出:1
|
||||||
|
|
||||||
提示:
|
提示:
|
||||||
|
|
||||||
* 1 <= nums.length <= 2500
|
* 1 <= nums.length <= 2500
|
||||||
|
@ -12,7 +12,7 @@
|
|||||||
|
|
||||||
# 344.反转字符串
|
# 344.反转字符串
|
||||||
|
|
||||||
https://leetcode-cn.com/problems/reverse-string/
|
[力扣题目链接](https://leetcode-cn.com/problems/reverse-string/)
|
||||||
|
|
||||||
编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 char[] 的形式给出。
|
编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 char[] 的形式给出。
|
||||||
|
|
||||||
@ -55,7 +55,7 @@ https://leetcode-cn.com/problems/reverse-string/
|
|||||||
|
|
||||||
接下来再来讲一下如何解决反转字符串的问题。
|
接下来再来讲一下如何解决反转字符串的问题。
|
||||||
|
|
||||||
大家应该还记得,我们已经讲过了[206.反转链表](https://mp.weixin.qq.com/s/ckEvIVGcNLfrz6OLOMoT0A)。
|
大家应该还记得,我们已经讲过了[206.反转链表](https://programmercarl.com/0206.翻转链表.html)。
|
||||||
|
|
||||||
在反转链表中,使用了双指针的方法。
|
在反转链表中,使用了双指针的方法。
|
||||||
|
|
||||||
@ -63,7 +63,7 @@ https://leetcode-cn.com/problems/reverse-string/
|
|||||||
|
|
||||||
因为字符串也是一种数组,所以元素在内存中是连续分布,这就决定了反转链表和反转字符串方式上还是有所差异的。
|
因为字符串也是一种数组,所以元素在内存中是连续分布,这就决定了反转链表和反转字符串方式上还是有所差异的。
|
||||||
|
|
||||||
如果对数组和链表原理不清楚的同学,可以看这两篇,[关于链表,你该了解这些!](https://mp.weixin.qq.com/s/fDGMmLrW7ZHlzkzlf_dZkw),[必须掌握的数组理论知识](https://mp.weixin.qq.com/s/c2KABb-Qgg66HrGf8z-8Og)。
|
如果对数组和链表原理不清楚的同学,可以看这两篇,[关于链表,你该了解这些!](https://programmercarl.com/链表理论基础.html),[必须掌握的数组理论知识](https://programmercarl.com/数组理论基础.html)。
|
||||||
|
|
||||||
对于字符串,我们定义两个指针(也可以说是索引下表),一个从字符串前面,一个从字符串后面,两个指针同时向中间移动,并交换元素。
|
对于字符串,我们定义两个指针(也可以说是索引下表),一个从字符串前面,一个从字符串后面,两个指针同时向中间移动,并交换元素。
|
||||||
|
|
||||||
|
@ -14,7 +14,7 @@
|
|||||||
|
|
||||||
## 349. 两个数组的交集
|
## 349. 两个数组的交集
|
||||||
|
|
||||||
https://leetcode-cn.com/problems/intersection-of-two-arrays/
|
[力扣题目链接](https://leetcode-cn.com/problems/intersection-of-two-arrays/)
|
||||||
|
|
||||||
题意:给定两个数组,编写一个函数来计算它们的交集。
|
题意:给定两个数组,编写一个函数来计算它们的交集。
|
||||||
|
|
||||||
@ -32,7 +32,7 @@ https://leetcode-cn.com/problems/intersection-of-two-arrays/
|
|||||||
|
|
||||||
这道题用暴力的解法时间复杂度是O(n^2),那来看看使用哈希法进一步优化。
|
这道题用暴力的解法时间复杂度是O(n^2),那来看看使用哈希法进一步优化。
|
||||||
|
|
||||||
那么用数组来做哈希表也是不错的选择,例如[242. 有效的字母异位词](https://mp.weixin.qq.com/s/ffS8jaVFNUWyfn_8T31IdA)
|
那么用数组来做哈希表也是不错的选择,例如[242. 有效的字母异位词](https://programmercarl.com/0242.有效的字母异位词.html)
|
||||||
|
|
||||||
但是要注意,**使用数组来做哈希的题目,是因为题目都限制了数值的大小。**
|
但是要注意,**使用数组来做哈希的题目,是因为题目都限制了数值的大小。**
|
||||||
|
|
||||||
|
@ -12,7 +12,7 @@
|
|||||||
|
|
||||||
# 541. 反转字符串II
|
# 541. 反转字符串II
|
||||||
|
|
||||||
https://leetcode-cn.com/problems/reverse-string-ii/
|
[力扣题目链接](https://leetcode-cn.com/problems/reverse-string-ii/)
|
||||||
|
|
||||||
给定一个字符串 s 和一个整数 k,你需要对从字符串开头算起的每隔 2k 个字符的前 k 个字符进行反转。
|
给定一个字符串 s 和一个整数 k,你需要对从字符串开头算起的每隔 2k 个字符的前 k 个字符进行反转。
|
||||||
|
|
||||||
@ -65,7 +65,7 @@ public:
|
|||||||
};
|
};
|
||||||
```
|
```
|
||||||
|
|
||||||
那么我们也可以实现自己的reverse函数,其实和题目[344. 反转字符串](https://mp.weixin.qq.com/s/_rNm66OJVl92gBDIbGpA3w)道理是一样的。
|
那么我们也可以实现自己的reverse函数,其实和题目[344. 反转字符串](https://programmercarl.com/0344.反转字符串.html)道理是一样的。
|
||||||
|
|
||||||
下面我实现的reverse函数区间是左闭右闭区间,代码如下:
|
下面我实现的reverse函数区间是左闭右闭区间,代码如下:
|
||||||
|
|
||||||
|
@ -10,7 +10,7 @@
|
|||||||
|
|
||||||
# 1002. 查找常用字符
|
# 1002. 查找常用字符
|
||||||
|
|
||||||
https://leetcode-cn.com/problems/find-common-characters/
|
[力扣题目链接](https://leetcode-cn.com/problems/find-common-characters/)
|
||||||
|
|
||||||
给定仅有小写字母组成的字符串数组 A,返回列表中的每个字符串中都显示的全部字符(包括重复字符)组成的列表。例如,如果一个字符在每个字符串中出现 3 次,但不是 4 次,则需要在最终答案中包含该字符 3 次。
|
给定仅有小写字母组成的字符串数组 A,返回列表中的每个字符串中都显示的全部字符(包括重复字符)组成的列表。例如,如果一个字符在每个字符串中出现 3 次,但不是 4 次,则需要在最终答案中包含该字符 3 次。
|
||||||
|
|
||||||
@ -23,7 +23,7 @@ https://leetcode-cn.com/problems/find-common-characters/
|
|||||||
【示例二】
|
【示例二】
|
||||||
输入:["cool","lock","cook"]
|
输入:["cool","lock","cook"]
|
||||||
输出:["c","o"]
|
输出:["c","o"]
|
||||||
|
|
||||||
|
|
||||||
# 思路
|
# 思路
|
||||||
|
|
||||||
@ -40,9 +40,9 @@ https://leetcode-cn.com/problems/find-common-characters/
|
|||||||
|
|
||||||
可以看出这是指数级别的时间复杂度,非常高,而且代码实现也不容易,因为要统计 重复的字符,还要适当的替换或者去重。
|
可以看出这是指数级别的时间复杂度,非常高,而且代码实现也不容易,因为要统计 重复的字符,还要适当的替换或者去重。
|
||||||
|
|
||||||
那我们还是哈希法吧。如果对哈希法不了解,可以看这篇:[关于哈希表,你该了解这些!](https://mp.weixin.qq.com/s/RSUANESA_tkhKhYe3ZR8Jg)。
|
那我们还是哈希法吧。如果对哈希法不了解,可以看这篇:[关于哈希表,你该了解这些!](https://programmercarl.com/哈希表理论基础.html)。
|
||||||
|
|
||||||
如果对用数组来做哈希法不了解的话,可以看这篇:[把数组当做哈希表来用,很巧妙!](https://mp.weixin.qq.com/s/ffS8jaVFNUWyfn_8T31IdA)。
|
如果对用数组来做哈希法不了解的话,可以看这篇:[把数组当做哈希表来用,很巧妙!](https://programmercarl.com/0242.有效的字母异位词.html)。
|
||||||
|
|
||||||
了解了哈希法,理解了数组在哈希法中的应用之后,可以来看解题思路了。
|
了解了哈希法,理解了数组在哈希法中的应用之后,可以来看解题思路了。
|
||||||
|
|
||||||
|
@ -13,7 +13,7 @@
|
|||||||
|
|
||||||
# 1047. 删除字符串中的所有相邻重复项
|
# 1047. 删除字符串中的所有相邻重复项
|
||||||
|
|
||||||
https://leetcode-cn.com/problems/remove-all-adjacent-duplicates-in-string/
|
[力扣题目链接](https://leetcode-cn.com/problems/remove-all-adjacent-duplicates-in-string/)
|
||||||
|
|
||||||
给出由小写字母组成的字符串 S,重复项删除操作会选择两个相邻且相同的字母,并删除它们。
|
给出由小写字母组成的字符串 S,重复项删除操作会选择两个相邻且相同的字母,并删除它们。
|
||||||
|
|
||||||
@ -26,7 +26,7 @@ https://leetcode-cn.com/problems/remove-all-adjacent-duplicates-in-string/
|
|||||||
* 输入:"abbaca"
|
* 输入:"abbaca"
|
||||||
* 输出:"ca"
|
* 输出:"ca"
|
||||||
* 解释:例如,在 "abbaca" 中,我们可以删除 "bb" 由于两字母相邻且相同,这是此时唯一可以执行删除操作的重复项。之后我们得到字符串 "aaca",其中又只有 "aa" 可以执行重复项删除操作,所以最后的字符串为 "ca"。
|
* 解释:例如,在 "abbaca" 中,我们可以删除 "bb" 由于两字母相邻且相同,这是此时唯一可以执行删除操作的重复项。之后我们得到字符串 "aaca",其中又只有 "aa" 可以执行重复项删除操作,所以最后的字符串为 "ca"。
|
||||||
|
|
||||||
|
|
||||||
提示:
|
提示:
|
||||||
* 1 <= S.length <= 20000
|
* 1 <= S.length <= 20000
|
||||||
|
@ -51,7 +51,7 @@
|
|||||||
|
|
||||||
## 总结
|
## 总结
|
||||||
|
|
||||||
同在广东省,难免不了要和深圳对比,大家如果看了这篇:[深圳原来有这么多互联网公司,你都知道么?](https://mp.weixin.qq.com/s/3VJHF2zNohBwDBxARFIn-Q)就能感受到鲜明的对比了。
|
同在广东省,难免不了要和深圳对比,大家如果看了这篇:[深圳原来有这么多互联网公司,你都知道么?](https://programmercarl.com/前序/深圳互联网公司总结.html)就能感受到鲜明的对比了。
|
||||||
|
|
||||||
广州大厂高端岗位其实比较少,本土只有微信和网易,微信呢毕竟还是腾讯的分部,而网易被很多人认为是杭州企业,其实网易总部在广州。
|
广州大厂高端岗位其实比较少,本土只有微信和网易,微信呢毕竟还是腾讯的分部,而网易被很多人认为是杭州企业,其实网易总部在广州。
|
||||||
|
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
|
|
||||||
## 周一
|
## 周一
|
||||||
|
|
||||||
在[关于动态规划,你该了解这些!](https://mp.weixin.qq.com/s/ocZwfPlCWrJtVGACqFNAag)中我们讲解了动态规划的基础知识。
|
在[关于动态规划,你该了解这些!](https://programmercarl.com/动态规划理论基础.html)中我们讲解了动态规划的基础知识。
|
||||||
|
|
||||||
首先讲一下动规和贪心的区别,其实大家不用太强调理论上的区别,做做题,就感受出来了。
|
首先讲一下动规和贪心的区别,其实大家不用太强调理论上的区别,做做题,就感受出来了。
|
||||||
|
|
||||||
@ -33,13 +33,13 @@
|
|||||||
|
|
||||||
## 周二
|
## 周二
|
||||||
|
|
||||||
这道题目[动态规划:斐波那契数](https://mp.weixin.qq.com/s/ko0zLJplF7n_4TysnPOa_w)是当之无愧的动规入门题。
|
这道题目[动态规划:斐波那契数](https://programmercarl.com/0509.斐波那契数.html)是当之无愧的动规入门题。
|
||||||
|
|
||||||
简单题,我们就是用来了解方法论的,用动规五部曲走一遍,题目其实已经把递推公式,和dp数组如何初始化都给我们了。
|
简单题,我们就是用来了解方法论的,用动规五部曲走一遍,题目其实已经把递推公式,和dp数组如何初始化都给我们了。
|
||||||
|
|
||||||
## 周三
|
## 周三
|
||||||
|
|
||||||
[动态规划:爬楼梯](https://mp.weixin.qq.com/s/Ohop0jApSII9xxOMiFhGIw) 这道题目其实就是斐波那契数列。
|
[动态规划:爬楼梯](https://programmercarl.com/0070.爬楼梯.html) 这道题目其实就是斐波那契数列。
|
||||||
|
|
||||||
但正常思考过程应该是推导完递推公式之后,发现这是斐波那契,而不是上来就知道这是斐波那契。
|
但正常思考过程应该是推导完递推公式之后,发现这是斐波那契,而不是上来就知道这是斐波那契。
|
||||||
|
|
||||||
@ -98,11 +98,11 @@ public:
|
|||||||
|
|
||||||
这道绝佳的面试题我没有用过,如果录友们有面试别人的需求,就把这个套路拿去吧,哈哈哈。
|
这道绝佳的面试题我没有用过,如果录友们有面试别人的需求,就把这个套路拿去吧,哈哈哈。
|
||||||
|
|
||||||
我在[通过一道面试题目,讲一讲递归算法的时间复杂度!](https://mp.weixin.qq.com/s/I6ZXFbw09NR31F5CJR_geQ)中,以我自己面试别人的真实经历,通过求x的n次方 这么简单的题目,就可以考察候选人对算法性能以及递归的理解深度,录友们可以看看,绝对有收获!
|
我在[通过一道面试题目,讲一讲递归算法的时间复杂度!](https://programmercarl.com/前序/通过一道面试题目,讲一讲递归算法的时间复杂度!.html)中,以我自己面试别人的真实经历,通过求x的n次方 这么简单的题目,就可以考察候选人对算法性能以及递归的理解深度,录友们可以看看,绝对有收获!
|
||||||
|
|
||||||
## 周四
|
## 周四
|
||||||
|
|
||||||
这道题目[动态规划:使用最小花费爬楼梯](https://mp.weixin.qq.com/s/djZB9gkyLFAKcQcSvKDorA)就是在爬台阶的基础上加了一个花费,
|
这道题目[动态规划:使用最小花费爬楼梯](https://programmercarl.com/0746.使用最小花费爬楼梯.html)就是在爬台阶的基础上加了一个花费,
|
||||||
|
|
||||||
这道题描述也确实有点魔幻。
|
这道题描述也确实有点魔幻。
|
||||||
|
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
|
|
||||||
## 周一
|
## 周一
|
||||||
|
|
||||||
[动态规划:不同路径](https://mp.weixin.qq.com/s/MGgGIt4QCpFMROE9X9he_A)中求从出发点到终点有几种路径,只能向下或者向右移动一步。
|
[动态规划:不同路径](https://programmercarl.com/0062.不同路径.html)中求从出发点到终点有几种路径,只能向下或者向右移动一步。
|
||||||
|
|
||||||
我们提供了三种方法,但重点讲解的还是动规,也是需要重点掌握的。
|
我们提供了三种方法,但重点讲解的还是动规,也是需要重点掌握的。
|
||||||
|
|
||||||
@ -35,7 +35,7 @@ for (int i = 1; i < m; i++) {
|
|||||||
|
|
||||||
## 周二
|
## 周二
|
||||||
|
|
||||||
[动态规划:不同路径还不够,要有障碍!](https://mp.weixin.qq.com/s/lhqF0O4le9-wvalptOVOww)相对于[动态规划:不同路径](https://mp.weixin.qq.com/s/MGgGIt4QCpFMROE9X9he_A)添加了障碍。
|
[动态规划:不同路径还不够,要有障碍!](https://programmercarl.com/0063.不同路径II.html)相对于[动态规划:不同路径](https://programmercarl.com/0062.不同路径.html)添加了障碍。
|
||||||
|
|
||||||
dp[i][j]定义依然是:表示从(0 ,0)出发,到(i, j) 有dp[i][j]条不同的路径。
|
dp[i][j]定义依然是:表示从(0 ,0)出发,到(i, j) 有dp[i][j]条不同的路径。
|
||||||
|
|
||||||
@ -78,7 +78,7 @@ for (int i = 1; i < m; i++) {
|
|||||||
|
|
||||||
## 周三
|
## 周三
|
||||||
|
|
||||||
[动态规划:整数拆分,你要怎么拆?](https://mp.weixin.qq.com/s/cVbyHrsWH_Rfzlj-ESr01A)给出一个整数,问有多少种拆分的方法。
|
[动态规划:整数拆分,你要怎么拆?](https://programmercarl.com/0343.整数拆分.html)给出一个整数,问有多少种拆分的方法。
|
||||||
|
|
||||||
这道题目就有点难度了,题目中dp我也给出了两种方法,但通过两种方法的比较可以看出,对dp数组定义的理解,以及dp数组初始化的重要性。
|
这道题目就有点难度了,题目中dp我也给出了两种方法,但通过两种方法的比较可以看出,对dp数组定义的理解,以及dp数组初始化的重要性。
|
||||||
|
|
||||||
@ -121,7 +121,7 @@ for (int i = 3; i <= n ; i++) {
|
|||||||
|
|
||||||
**或者也可以理解j是拆分i的第一个整数**。
|
**或者也可以理解j是拆分i的第一个整数**。
|
||||||
|
|
||||||
[动态规划:整数拆分,你要怎么拆?](https://mp.weixin.qq.com/s/cVbyHrsWH_Rfzlj-ESr01A)总结里,我也给出了递推公式dp[i] = max(dp[i], dp[i - j] * dp[j])这种写法。
|
[动态规划:整数拆分,你要怎么拆?](https://programmercarl.com/0343.整数拆分.html)总结里,我也给出了递推公式dp[i] = max(dp[i], dp[i - j] * dp[j])这种写法。
|
||||||
|
|
||||||
对于这种写法,一位录友总结的很好,意思就是:如果递推公式是dp[i-j] * dp[j],这样就相当于强制把一个数至少拆分成四份。
|
对于这种写法,一位录友总结的很好,意思就是:如果递推公式是dp[i-j] * dp[j],这样就相当于强制把一个数至少拆分成四份。
|
||||||
|
|
||||||
@ -129,7 +129,7 @@ dp[i-j]至少是两个数的乘积,dp[j]又至少是两个数的乘积,但
|
|||||||
|
|
||||||
## 周四
|
## 周四
|
||||||
|
|
||||||
[动态规划:不同的二叉搜索树](https://mp.weixin.qq.com/s/8VE8pDrGxTf8NEVYBDwONw)给出n个不同的节点求能组成多少个不同二叉搜索树。
|
[动态规划:不同的二叉搜索树](https://programmercarl.com/0096.不同的二叉搜索树.html)给出n个不同的节点求能组成多少个不同二叉搜索树。
|
||||||
|
|
||||||
这道题目还是比较难的,想到用动态规划的方法就很不容易了!
|
这道题目还是比较难的,想到用动态规划的方法就很不容易了!
|
||||||
|
|
||||||
@ -145,7 +145,7 @@ n为5时候的dp数组状态如图:
|
|||||||
|
|
||||||
## 总结
|
## 总结
|
||||||
|
|
||||||
本周题目已经开始点难度了,特别是[动态规划:不同的二叉搜索树](https://mp.weixin.qq.com/s/8VE8pDrGxTf8NEVYBDwONw)这道题目,明显感觉阅读量很低,可能是因为确实有点难吧。
|
本周题目已经开始点难度了,特别是[动态规划:不同的二叉搜索树](https://programmercarl.com/0096.不同的二叉搜索树.html)这道题目,明显感觉阅读量很低,可能是因为确实有点难吧。
|
||||||
|
|
||||||
我现在也陷入了纠结,题目一简单,就会有录友和我反馈说题目太简单了,题目一难,阅读量就特别低。
|
我现在也陷入了纠结,题目一简单,就会有录友和我反馈说题目太简单了,题目一难,阅读量就特别低。
|
||||||
|
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
|
|
||||||
## 周一
|
## 周一
|
||||||
|
|
||||||
[动态规划:关于01背包问题,你该了解这些!](https://mp.weixin.qq.com/s/FwIiPPmR18_AJO5eiidT6w)中,我们开始介绍了背包问题。
|
[动态规划:关于01背包问题,你该了解这些!](https://programmercarl.com/背包理论基础01背包-1.html)中,我们开始介绍了背包问题。
|
||||||
|
|
||||||
首先对于背包的所有问题中,01背包是最最基础的,其他背包也是在01背包的基础上稍作变化。
|
首先对于背包的所有问题中,01背包是最最基础的,其他背包也是在01背包的基础上稍作变化。
|
||||||
|
|
||||||
@ -75,7 +75,7 @@ for(int i = 1; i < weight.size(); i++) { // 遍历物品
|
|||||||
|
|
||||||
## 周二
|
## 周二
|
||||||
|
|
||||||
[动态规划:关于01背包问题,你该了解这些!(滚动数组)](https://mp.weixin.qq.com/s/M4uHxNVKRKm5HPjkNZBnFA)中把01背包的一维dp数组(滚动数组)实现详细讲解了一遍。
|
[动态规划:关于01背包问题,你该了解这些!(滚动数组)](https://programmercarl.com/背包理论基础01背包-2.html)中把01背包的一维dp数组(滚动数组)实现详细讲解了一遍。
|
||||||
|
|
||||||
分析一下和二维dp数组有什么区别,在初始化和遍历顺序上又有什么差异?
|
分析一下和二维dp数组有什么区别,在初始化和遍历顺序上又有什么差异?
|
||||||
|
|
||||||
@ -125,7 +125,7 @@ for(int i = 0; i < weight.size(); i++) { // 遍历物品
|
|||||||
|
|
||||||
## 周三
|
## 周三
|
||||||
|
|
||||||
[动态规划:416. 分割等和子集](https://mp.weixin.qq.com/s/sYw3QtPPQ5HMZCJcT4EaLQ)中我们开始用01背包来解决问题。
|
[动态规划:416. 分割等和子集](https://programmercarl.com/0416.分割等和子集.html)中我们开始用01背包来解决问题。
|
||||||
|
|
||||||
只有确定了如下四点,才能把01背包问题套到本题上来。
|
只有确定了如下四点,才能把01背包问题套到本题上来。
|
||||||
|
|
||||||
@ -138,11 +138,11 @@ for(int i = 0; i < weight.size(); i++) { // 遍历物品
|
|||||||
|
|
||||||
## 周四
|
## 周四
|
||||||
|
|
||||||
[动态规划:1049. 最后一块石头的重量 II](https://mp.weixin.qq.com/s/WbwAo3jaUaNJjvhHgq0BGg)这道题目其实和[动态规划:416. 分割等和子集](https://mp.weixin.qq.com/s/sYw3QtPPQ5HMZCJcT4EaLQ)是非常像的。
|
[动态规划:1049. 最后一块石头的重量 II](https://programmercarl.com/1049.最后一块石头的重量II.html)这道题目其实和[动态规划:416. 分割等和子集](https://programmercarl.com/0416.分割等和子集.html)是非常像的。
|
||||||
|
|
||||||
本题其实就是尽量让石头分成重量相同的两堆,相撞之后剩下的石头最小,这样就化解成01背包问题了。
|
本题其实就是尽量让石头分成重量相同的两堆,相撞之后剩下的石头最小,这样就化解成01背包问题了。
|
||||||
|
|
||||||
[动态规划:416. 分割等和子集](https://mp.weixin.qq.com/s/sYw3QtPPQ5HMZCJcT4EaLQ)相当于是求背包是否正好装满,而本题是求背包最多能装多少。
|
[动态规划:416. 分割等和子集](https://programmercarl.com/0416.分割等和子集.html)相当于是求背包是否正好装满,而本题是求背包最多能装多少。
|
||||||
|
|
||||||
这两道题目是对dp[target]的处理方式不同。这也考验的对dp[i]定义的理解。
|
这两道题目是对dp[target]的处理方式不同。这也考验的对dp[i]定义的理解。
|
||||||
|
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
## 周一
|
## 周一
|
||||||
|
|
||||||
[动态规划:目标和!](https://mp.weixin.qq.com/s/2pWmaohX75gwxvBENS-NCw)要求在数列之间加入+ 或者 -,使其和为S。
|
[动态规划:目标和!](https://programmercarl.com/0494.目标和.html)要求在数列之间加入+ 或者 -,使其和为S。
|
||||||
|
|
||||||
所有数的总和为sum,假设加法的总和为x,那么可以推出x = (S + sum) / 2。
|
所有数的总和为sum,假设加法的总和为x,那么可以推出x = (S + sum) / 2。
|
||||||
|
|
||||||
@ -39,7 +39,7 @@ dp数组状态变化如下:
|
|||||||
|
|
||||||
## 周二
|
## 周二
|
||||||
|
|
||||||
这道题目[动态规划:一和零!](https://mp.weixin.qq.com/s/x-u3Dsp76DlYqtCe0xEKJw)算有点难度。
|
这道题目[动态规划:一和零!](https://programmercarl.com/0474.一和零.html)算有点难度。
|
||||||
|
|
||||||
**不少同学都以为是多重背包,其实这是一道标准的01背包**。
|
**不少同学都以为是多重背包,其实这是一道标准的01背包**。
|
||||||
|
|
||||||
@ -78,7 +78,7 @@ dp[i][j] = max(dp[i][j], dp[i - zeroNum][j - oneNum] + 1);
|
|||||||
|
|
||||||
此时01背包我们就讲完了,正式开始完全背包。
|
此时01背包我们就讲完了,正式开始完全背包。
|
||||||
|
|
||||||
在[动态规划:关于完全背包,你该了解这些!](https://mp.weixin.qq.com/s/akwyxlJ4TLvKcw26KB9uJw)中我们讲解了完全背包的理论基础。
|
在[动态规划:关于完全背包,你该了解这些!](https://programmercarl.com/背包问题理论基础完全背包.html)中我们讲解了完全背包的理论基础。
|
||||||
|
|
||||||
其实完全背包和01背包区别就是完全背包的物品是无限数量。
|
其实完全背包和01背包区别就是完全背包的物品是无限数量。
|
||||||
|
|
||||||
@ -100,7 +100,7 @@ for(int i = 0; i < weight.size(); i++) { // 遍历物品
|
|||||||
|
|
||||||
**那么为什么要先遍历物品,在遍历背包呢?** (灵魂拷问)
|
**那么为什么要先遍历物品,在遍历背包呢?** (灵魂拷问)
|
||||||
|
|
||||||
其实对于纯完全背包,先遍历物品,再遍历背包 与 先遍历背包,再遍历物品都是可以的。我在文中[动态规划:关于完全背包,你该了解这些!](https://mp.weixin.qq.com/s/akwyxlJ4TLvKcw26KB9uJw)也给出了详细的解释。
|
其实对于纯完全背包,先遍历物品,再遍历背包 与 先遍历背包,再遍历物品都是可以的。我在文中[动态规划:关于完全背包,你该了解这些!](https://programmercarl.com/背包问题理论基础完全背包.html)也给出了详细的解释。
|
||||||
|
|
||||||
这个细节是很多同学忽略掉的点,其实也不算细节了,**相信不少同学在写背包的时候,两层for循环的先后循序搞不清楚,靠感觉来的**。
|
这个细节是很多同学忽略掉的点,其实也不算细节了,**相信不少同学在写背包的时候,两层for循环的先后循序搞不清楚,靠感觉来的**。
|
||||||
|
|
||||||
@ -110,7 +110,7 @@ for(int i = 0; i < weight.size(); i++) { // 遍历物品
|
|||||||
|
|
||||||
## 周四
|
## 周四
|
||||||
|
|
||||||
在[动态规划:给你一些零钱,你要怎么凑?](https://mp.weixin.qq.com/s/PlowDsI4WMBOzf3q80AksQ)中就是给你一堆零钱(零钱个数无限),为凑成amount的组合数有几种。
|
在[动态规划:给你一些零钱,你要怎么凑?](https://programmercarl.com/0518.零钱兑换II.html)中就是给你一堆零钱(零钱个数无限),为凑成amount的组合数有几种。
|
||||||
|
|
||||||
**注意这里组合数和排列数的区别!**
|
**注意这里组合数和排列数的区别!**
|
||||||
|
|
||||||
@ -134,7 +134,7 @@ for(int i = 0; i < weight.size(); i++) { // 遍历物品
|
|||||||
|
|
||||||
其实这是一种错觉,或者说对动规理解的不够深入!
|
其实这是一种错觉,或者说对动规理解的不够深入!
|
||||||
|
|
||||||
我在动规专题开篇介绍[关于动态规划,你该了解这些!](https://mp.weixin.qq.com/s/ocZwfPlCWrJtVGACqFNAag)中就强调了 **递推公式仅仅是 动规五部曲里的一小部分, dp数组的定义、初始化、遍历顺序,哪一点没有搞透的话,即使知道递推公式,遇到稍稍难一点的动规题目立刻会感觉写不出来了**。
|
我在动规专题开篇介绍[关于动态规划,你该了解这些!](https://programmercarl.com/动态规划理论基础.html)中就强调了 **递推公式仅仅是 动规五部曲里的一小部分, dp数组的定义、初始化、遍历顺序,哪一点没有搞透的话,即使知道递推公式,遇到稍稍难一点的动规题目立刻会感觉写不出来了**。
|
||||||
|
|
||||||
此时相信大家对动规五部曲也有更深的理解了,同样也验证了Carl之前讲过的:**简单题是用来学习方法论的,而遇到难题才体现出方法论的重要性!**
|
此时相信大家对动规五部曲也有更深的理解了,同样也验证了Carl之前讲过的:**简单题是用来学习方法论的,而遇到难题才体现出方法论的重要性!**
|
||||||
|
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
## 周一
|
## 周一
|
||||||
|
|
||||||
[动态规划:377. 组合总和 Ⅳ](https://mp.weixin.qq.com/s/Iixw0nahJWQgbqVNk8k6gA)中给定一个由正整数组成且不存在重复数字的数组,找出和为给定目标正整数的组合的个数(顺序不同的序列被视作不同的组合)。
|
[动态规划:377. 组合总和 Ⅳ](https://programmercarl.com/0377.组合总和Ⅳ.html)中给定一个由正整数组成且不存在重复数字的数组,找出和为给定目标正整数的组合的个数(顺序不同的序列被视作不同的组合)。
|
||||||
|
|
||||||
题目面试虽然是组合,但又强调顺序不同的序列被视作不同的组合,其实这道题目求的是排列数!
|
题目面试虽然是组合,但又强调顺序不同的序列被视作不同的组合,其实这道题目求的是排列数!
|
||||||
|
|
||||||
@ -10,7 +10,7 @@
|
|||||||
|
|
||||||
这个和前上周讲的组合问题又不一样,关键就体现在遍历顺序上!
|
这个和前上周讲的组合问题又不一样,关键就体现在遍历顺序上!
|
||||||
|
|
||||||
在[动态规划:518.零钱兑换II](https://mp.weixin.qq.com/s/PlowDsI4WMBOzf3q80AksQ) 中就已经讲过了。
|
在[动态规划:518.零钱兑换II](https://programmercarl.com/0518.零钱兑换II.html) 中就已经讲过了。
|
||||||
|
|
||||||
**如果求组合数就是外层for循环遍历物品,内层for遍历背包**。
|
**如果求组合数就是外层for循环遍历物品,内层for遍历背包**。
|
||||||
|
|
||||||
@ -40,7 +40,7 @@ public:
|
|||||||
|
|
||||||
## 周二
|
## 周二
|
||||||
|
|
||||||
爬楼梯之前我们已经做过了,就是斐波那契数列,很好解,但[动态规划:70. 爬楼梯进阶版(完全背包)](https://mp.weixin.qq.com/s/e_wacnELo-2PG76EjrUakA)中我们进阶了一下。
|
爬楼梯之前我们已经做过了,就是斐波那契数列,很好解,但[动态规划:70. 爬楼梯进阶版(完全背包)](https://programmercarl.com/0070.爬楼梯完全背包版本.html)中我们进阶了一下。
|
||||||
|
|
||||||
改为:每次可以爬 1 、 2、.....、m 个台阶。问有多少种不同的方法可以爬到楼顶呢?
|
改为:每次可以爬 1 、 2、.....、m 个台阶。问有多少种不同的方法可以爬到楼顶呢?
|
||||||
|
|
||||||
@ -53,7 +53,7 @@ public:
|
|||||||
**此时大家应该发现这就是一个完全背包问题了!**
|
**此时大家应该发现这就是一个完全背包问题了!**
|
||||||
|
|
||||||
|
|
||||||
和昨天的题目[动态规划:377. 组合总和 Ⅳ](https://mp.weixin.qq.com/s/Iixw0nahJWQgbqVNk8k6gA)基本就是一道题了,遍历顺序也是一样一样的!
|
和昨天的题目[动态规划:377. 组合总和 Ⅳ](https://programmercarl.com/0377.组合总和Ⅳ.html)基本就是一道题了,遍历顺序也是一样一样的!
|
||||||
|
|
||||||
代码如下:
|
代码如下:
|
||||||
```CPP
|
```CPP
|
||||||
@ -77,7 +77,7 @@ public:
|
|||||||
|
|
||||||
## 周三
|
## 周三
|
||||||
|
|
||||||
[动态规划:322.零钱兑换](https://mp.weixin.qq.com/s/dyk-xNilHzNtVdPPLObSeQ)给定不同面额的硬币 coins 和一个总金额 amount。编写一个函数来计算可以凑成总金额所需的最少的硬币个数(每种硬币的数量是无限的)。
|
[动态规划:322.零钱兑换](https://programmercarl.com/0322.零钱兑换.html)给定不同面额的硬币 coins 和一个总金额 amount。编写一个函数来计算可以凑成总金额所需的最少的硬币个数(每种硬币的数量是无限的)。
|
||||||
|
|
||||||
这里我们都知道这是完全背包。
|
这里我们都知道这是完全背包。
|
||||||
|
|
||||||
@ -137,10 +137,10 @@ public:
|
|||||||
|
|
||||||
## 周四
|
## 周四
|
||||||
|
|
||||||
[动态规划:279.完全平方数](https://mp.weixin.qq.com/s/VfJT78p7UGpDZsapKF_QJQ)给定正整数 n,找到若干个完全平方数(比如 1, 4, 9, 16, ...)使得它们的和等于 n。你需要让组成和的完全平方数的个数最少(平方数可以重复使用)。
|
[动态规划:279.完全平方数](https://programmercarl.com/0279.完全平方数.html)给定正整数 n,找到若干个完全平方数(比如 1, 4, 9, 16, ...)使得它们的和等于 n。你需要让组成和的完全平方数的个数最少(平方数可以重复使用)。
|
||||||
|
|
||||||
|
|
||||||
如果按顺序把前面的文章都看了,这道题目就是简单题了。 dp[i]的定义,递推公式,初始化,遍历顺序,都是和[动态规划:322. 零钱兑换](https://mp.weixin.qq.com/s/dyk-xNilHzNtVdPPLObSeQ) 一样一样的。
|
如果按顺序把前面的文章都看了,这道题目就是简单题了。 dp[i]的定义,递推公式,初始化,遍历顺序,都是和[动态规划:322. 零钱兑换](https://programmercarl.com/0322.零钱兑换.html) 一样一样的。
|
||||||
|
|
||||||
要是没有前面的基础上来做这道题,那这道题目就有点难度了。
|
要是没有前面的基础上来做这道题,那这道题目就有点难度了。
|
||||||
|
|
||||||
@ -193,9 +193,9 @@ public:
|
|||||||
|
|
||||||
我这里做一下总结:
|
我这里做一下总结:
|
||||||
|
|
||||||
求组合数:[动态规划:518.零钱兑换II](https://mp.weixin.qq.com/s/PlowDsI4WMBOzf3q80AksQ)
|
求组合数:[动态规划:518.零钱兑换II](https://programmercarl.com/0518.零钱兑换II.html)
|
||||||
求排列数:[动态规划:377. 组合总和 Ⅳ](https://mp.weixin.qq.com/s/Iixw0nahJWQgbqVNk8k6gA)、[动态规划:70. 爬楼梯进阶版(完全背包)](https://mp.weixin.qq.com/s/e_wacnELo-2PG76EjrUakA)
|
求排列数:[动态规划:377. 组合总和 Ⅳ](https://programmercarl.com/0377.组合总和Ⅳ.html)、[动态规划:70. 爬楼梯进阶版(完全背包)](https://programmercarl.com/0070.爬楼梯完全背包版本.html)
|
||||||
求最小数:[动态规划:322. 零钱兑换](https://mp.weixin.qq.com/s/dyk-xNilHzNtVdPPLObSeQ)、[动态规划:279.完全平方数](https://mp.weixin.qq.com/s/VfJT78p7UGpDZsapKF_QJQ)
|
求最小数:[动态规划:322. 零钱兑换](https://programmercarl.com/0322.零钱兑换.html)、[动态规划:279.完全平方数](https://programmercarl.com/0279.完全平方数.html)
|
||||||
|
|
||||||
此时我们就已经把完全背包的遍历顺序研究的透透的了!
|
此时我们就已经把完全背包的遍历顺序研究的透透的了!
|
||||||
|
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
|
|
||||||
## 周一
|
## 周一
|
||||||
|
|
||||||
[动态规划:开始打家劫舍!](https://mp.weixin.qq.com/s/UZ31WdLEEFmBegdgLkJ8Dw)中就是给一个数组相邻之间不能连着偷,如果偷才能得到最大金钱。
|
[动态规划:开始打家劫舍!](https://programmercarl.com/0198.打家劫舍.html)中就是给一个数组相邻之间不能连着偷,如果偷才能得到最大金钱。
|
||||||
|
|
||||||
1. 确定dp数组含义
|
1. 确定dp数组含义
|
||||||
|
|
||||||
@ -35,7 +35,7 @@ dp[1] = max(nums[0], nums[1]);
|
|||||||
|
|
||||||
## 周二
|
## 周二
|
||||||
|
|
||||||
[动态规划:继续打家劫舍!](https://mp.weixin.qq.com/s/kKPx4HpH3RArbRcxAVHbeQ)就是数组成环了,然后相邻的不能连着偷。
|
[动态规划:继续打家劫舍!](https://programmercarl.com/0213.打家劫舍II.html)就是数组成环了,然后相邻的不能连着偷。
|
||||||
|
|
||||||
这里主要考虑清楚三种情况:
|
这里主要考虑清楚三种情况:
|
||||||
|
|
||||||
@ -61,11 +61,11 @@ dp[1] = max(nums[0], nums[1]);
|
|||||||
|
|
||||||
所以我在本文重点强调了情况一二三是“考虑”的范围,而具体房间偷与不偷交给递推公式去抉择。
|
所以我在本文重点强调了情况一二三是“考虑”的范围,而具体房间偷与不偷交给递推公式去抉择。
|
||||||
|
|
||||||
剩下的就和[动态规划:开始打家劫舍!](https://mp.weixin.qq.com/s/UZ31WdLEEFmBegdgLkJ8Dw)是一个逻辑了。
|
剩下的就和[动态规划:开始打家劫舍!](https://programmercarl.com/0198.打家劫舍.html)是一个逻辑了。
|
||||||
|
|
||||||
## 周三
|
## 周三
|
||||||
|
|
||||||
[动态规划:还要打家劫舍!](https://mp.weixin.qq.com/s/BOJ1lHsxbQxUZffXlgglEQ)这次是在一颗二叉树上打家劫舍了,条件还是一样的,相临的不能偷。
|
[动态规划:还要打家劫舍!](https://programmercarl.com/0337.打家劫舍III.html)这次是在一颗二叉树上打家劫舍了,条件还是一样的,相临的不能偷。
|
||||||
|
|
||||||
这道题目是树形DP的入门题目,其实树形DP其实就是在树上进行递推公式的推导,没有什么神秘的。
|
这道题目是树形DP的入门题目,其实树形DP其实就是在树上进行递推公式的推导,没有什么神秘的。
|
||||||
|
|
||||||
@ -184,14 +184,14 @@ return {val2, val1};
|
|||||||
|
|
||||||
因为平时我们习惯了在一维数组或者二维数组上推导公式,一下子换成了树,就需要对树的遍历方式足够了解!
|
因为平时我们习惯了在一维数组或者二维数组上推导公式,一下子换成了树,就需要对树的遍历方式足够了解!
|
||||||
|
|
||||||
大家还记不记得我在讲解贪心专题的时候,讲到这道题目:[贪心算法:我要监控二叉树!](https://mp.weixin.qq.com/s/kCxlLLjWKaE6nifHC3UL2Q),这也是贪心算法在树上的应用。**那我也可以把这个算法起一个名字,叫做树形贪心**,哈哈哈
|
大家还记不记得我在讲解贪心专题的时候,讲到这道题目:[贪心算法:我要监控二叉树!](https://programmercarl.com/0968.监控二叉树.html),这也是贪心算法在树上的应用。**那我也可以把这个算法起一个名字,叫做树形贪心**,哈哈哈
|
||||||
|
|
||||||
“树形贪心”词汇从此诞生,来自「代码随想录」
|
“树形贪心”词汇从此诞生,来自「代码随想录」
|
||||||
|
|
||||||
|
|
||||||
## 周四
|
## 周四
|
||||||
|
|
||||||
[动态规划:买卖股票的最佳时机](https://mp.weixin.qq.com/s/keWo5qYJY4zmHn3amfXdfQ) 一段时间,只能买买一次,问最大收益。
|
[动态规划:买卖股票的最佳时机](https://programmercarl.com/0121.买卖股票的最佳时机.html) 一段时间,只能买买一次,问最大收益。
|
||||||
|
|
||||||
这里我给出了三中解法:
|
这里我给出了三中解法:
|
||||||
|
|
||||||
|
@ -3,9 +3,9 @@
|
|||||||
|
|
||||||
## 周一
|
## 周一
|
||||||
|
|
||||||
[动态规划:买卖股票的最佳时机II](https://mp.weixin.qq.com/s/d4TRWFuhaY83HPa6t5ZL-w)中股票可以买买多了次!
|
[动态规划:买卖股票的最佳时机II](https://programmercarl.com/0122.买卖股票的最佳时机II(动态规划).html)中股票可以买买多了次!
|
||||||
|
|
||||||
这也是和[121. 买卖股票的最佳时机](https://mp.weixin.qq.com/s/keWo5qYJY4zmHn3amfXdfQ)的唯一区别(注意只有一只股票,所以再次购买前要出售掉之前的股票)
|
这也是和[121. 买卖股票的最佳时机](https://programmercarl.com/0121.买卖股票的最佳时机.html)的唯一区别(注意只有一只股票,所以再次购买前要出售掉之前的股票)
|
||||||
|
|
||||||
重点在于递推公式公式的不同。
|
重点在于递推公式公式的不同。
|
||||||
|
|
||||||
@ -22,7 +22,7 @@ dp[i][0] = max(dp[i - 1][0], dp[i - 1][1] - prices[i]);
|
|||||||
dp[i][1] = max(dp[i - 1][1], dp[i - 1][0] + prices[i]);
|
dp[i][1] = max(dp[i - 1][1], dp[i - 1][0] + prices[i]);
|
||||||
```
|
```
|
||||||
|
|
||||||
大家可以发现本题和[121. 买卖股票的最佳时机](https://mp.weixin.qq.com/s/keWo5qYJY4zmHn3amfXdfQ)的代码几乎一样,唯一的区别在:
|
大家可以发现本题和[121. 买卖股票的最佳时机](https://programmercarl.com/0121.买卖股票的最佳时机.html)的代码几乎一样,唯一的区别在:
|
||||||
|
|
||||||
```
|
```
|
||||||
dp[i][0] = max(dp[i - 1][0], dp[i - 1][1] - prices[i]);
|
dp[i][0] = max(dp[i - 1][0], dp[i - 1][1] - prices[i]);
|
||||||
@ -32,7 +32,7 @@ dp[i][0] = max(dp[i - 1][0], dp[i - 1][1] - prices[i]);
|
|||||||
|
|
||||||
## 周二
|
## 周二
|
||||||
|
|
||||||
[动态规划:买卖股票的最佳时机III](https://mp.weixin.qq.com/s/Sbs157mlVDtAR0gbLpdKzg)中最多只能完成两笔交易。
|
[动态规划:买卖股票的最佳时机III](https://programmercarl.com/0123.买卖股票的最佳时机III.html)中最多只能完成两笔交易。
|
||||||
|
|
||||||
**这意味着可以买卖一次,可以买卖两次,也可以不买卖**。
|
**这意味着可以买卖一次,可以买卖两次,也可以不买卖**。
|
||||||
|
|
||||||
@ -85,9 +85,9 @@ dp[0][4] = 0;
|
|||||||
|
|
||||||
## 周三
|
## 周三
|
||||||
|
|
||||||
[动态规划:买卖股票的最佳时机IV](https://mp.weixin.qq.com/s/jtxZJWAo2y5sUsW647Z5cw)最多可以完成 k 笔交易。
|
[动态规划:买卖股票的最佳时机IV](https://programmercarl.com/0188.买卖股票的最佳时机IV.html)最多可以完成 k 笔交易。
|
||||||
|
|
||||||
相对于上一道[动态规划:123.买卖股票的最佳时机III](https://mp.weixin.qq.com/s/Sbs157mlVDtAR0gbLpdKzg),本题需要通过前两次的交易,来类比前k次的交易
|
相对于上一道[动态规划:123.买卖股票的最佳时机III](https://programmercarl.com/0123.买卖股票的最佳时机III.html),本题需要通过前两次的交易,来类比前k次的交易
|
||||||
|
|
||||||
|
|
||||||
1. 确定dp数组以及下标的含义
|
1. 确定dp数组以及下标的含义
|
||||||
@ -117,7 +117,7 @@ for (int j = 0; j < 2 * k - 1; j += 2) {
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
**本题和[动态规划:123.买卖股票的最佳时机III](https://mp.weixin.qq.com/s/Sbs157mlVDtAR0gbLpdKzg)最大的区别就是这里要类比j为奇数是买,偶数是卖剩的状态**。
|
**本题和[动态规划:123.买卖股票的最佳时机III](https://programmercarl.com/0123.买卖股票的最佳时机III.html)最大的区别就是这里要类比j为奇数是买,偶数是卖剩的状态**。
|
||||||
|
|
||||||
3. dp数组如何初始化
|
3. dp数组如何初始化
|
||||||
|
|
||||||
@ -147,9 +147,9 @@ for (int j = 1; j < 2 * k; j += 2) {
|
|||||||
|
|
||||||
## 周四
|
## 周四
|
||||||
|
|
||||||
[动态规划:最佳买卖股票时机含冷冻期](https://mp.weixin.qq.com/s/IgC0iWWCDpYL9ZbTHGHgfw)尽可能地完成更多的交易(多次买卖一支股票),但有冷冻期,冷冻期为1天
|
[动态规划:最佳买卖股票时机含冷冻期](https://programmercarl.com/0309.最佳买卖股票时机含冷冻期.html)尽可能地完成更多的交易(多次买卖一支股票),但有冷冻期,冷冻期为1天
|
||||||
|
|
||||||
相对于[动态规划:122.买卖股票的最佳时机II](https://mp.weixin.qq.com/s/d4TRWFuhaY83HPa6t5ZL-w),本题加上了一个冷冻期
|
相对于[动态规划:122.买卖股票的最佳时机II](https://programmercarl.com/0122.买卖股票的最佳时机II(动态规划).html),本题加上了一个冷冻期
|
||||||
|
|
||||||
|
|
||||||
**本题则需要第三个状态:不持有股票(冷冻期)的最多现金**。
|
**本题则需要第三个状态:不持有股票(冷冻期)的最多现金**。
|
||||||
|
@ -174,7 +174,7 @@ vector<int> postorderTraversal(TreeNode* root) {
|
|||||||
```
|
```
|
||||||
### 广度优先遍历(队列)
|
### 广度优先遍历(队列)
|
||||||
|
|
||||||
相关题解:[0102.二叉树的层序遍历](https://github.com/youngyangyang04/leetcode/blob/master/problems/0102.二叉树的层序遍历.md)
|
相关题解:[0102.二叉树的层序遍历](https://programmercarl.com/0102.二叉树的层序遍历.html)
|
||||||
|
|
||||||
```
|
```
|
||||||
vector<vector<int>> levelOrder(TreeNode* root) {
|
vector<vector<int>> levelOrder(TreeNode* root) {
|
||||||
@ -202,13 +202,13 @@ vector<vector<int>> levelOrder(TreeNode* root) {
|
|||||||
|
|
||||||
可以直接解决如下题目:
|
可以直接解决如下题目:
|
||||||
|
|
||||||
* [0102.二叉树的层序遍历](https://github.com/youngyangyang04/leetcode/blob/master/problems/0102.二叉树的层序遍历.md)
|
* [0102.二叉树的层序遍历](https://programmercarl.com/0102.二叉树的层序遍历.html)
|
||||||
* [0199.二叉树的右视图](https://github.com/youngyangyang04/leetcode/blob/master/problems/0199.二叉树的右视图.md)
|
* [0199.二叉树的右视图](https://github.com/youngyangyang04/leetcode/blob/master/problems/0199.二叉树的右视图.md)
|
||||||
* [0637.二叉树的层平均值](https://github.com/youngyangyang04/leetcode/blob/master/problems/0637.二叉树的层平均值.md)
|
* [0637.二叉树的层平均值](https://github.com/youngyangyang04/leetcode/blob/master/problems/0637.二叉树的层平均值.md)
|
||||||
* [0104.二叉树的最大深度 (迭代法)](https://github.com/youngyangyang04/leetcode/blob/master/problems/0104.二叉树的最大深度.md)
|
* [0104.二叉树的最大深度 (迭代法)](https://programmercarl.com/0104.二叉树的最大深度.html)
|
||||||
|
|
||||||
* [0111.二叉树的最小深度(迭代法)]((https://github.com/youngyangyang04/leetcode/blob/master/problems/0111.二叉树的最小深度.md))
|
* [0111.二叉树的最小深度(迭代法)](https://programmercarl.com/0111.二叉树的最小深度.html)
|
||||||
* [0222.完全二叉树的节点个数(迭代法)](https://github.com/youngyangyang04/leetcode/blob/master/problems/0222.完全二叉树的节点个数.md)
|
* [0222.完全二叉树的节点个数(迭代法)](https://programmercarl.com/0222.完全二叉树的节点个数.html)
|
||||||
|
|
||||||
### 二叉树深度
|
### 二叉树深度
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user