Skip to content

Commit 64d3b35

Browse files
committed
update content
1 parent bd7ab10 commit 64d3b35

24 files changed

+52
-52
lines changed

动态规划系列/动态规划之博弈问题.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@
3636

3737
这样推广之后就变成了一道难度比较高的动态规划问题了,力扣第 486 题「预测赢家」就是一道类似的问题:
3838

39-
![](https://labuladong.github.io/pictures/博弈问题/title.jpg)
39+
<Problem slug="predict-the-winner" />
4040

4141
函数签名如下:
4242

动态规划系列/动态规划设计:最长递增子序列.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -234,7 +234,7 @@ int lengthOfLIS(int[] nums) {
234234

235235
我们看一个经常出现在生活中的有趣问题,力扣第 354 题「俄罗斯套娃信封问题」,先看下题目:
236236

237-
![](https://labuladong.github.io/pictures/信封嵌套/title.png)
237+
<Problem slug="russian-doll-envelopes" />
238238

239239
**这道题目其实是最长递增子序列的一个变种,因为每次合法的嵌套是大的套小的,相当于在二维平面中找一个最长递增的子序列,其长度就是最多能嵌套的信封个数**
240240

动态规划系列/单词拼接.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@
3838

3939
首先看下力扣第 139 题「单词拆分」:
4040

41-
![](https://labuladong.github.io/pictures/单词拆分/title.jpg)
41+
<Problem slug="word-break" />
4242

4343
函数签名如下:
4444

@@ -348,7 +348,7 @@ class Solution {
348348

349349
有了上一道题的铺垫,力扣第 140 题「单词拆分 II」就容易多了,先看下题目:
350350

351-
![](https://labuladong.github.io/pictures/单词拆分/title2.jpg)
351+
<Problem slug="word-break-ii" />
352352

353353
相较上一题,这道题不是单单问你 `s` 是否能被拼出,还要问你是怎么拼的,其实只要把之前的解法稍微改一改就可以解决这道题。
354354

动态规划系列/团灭股票问题.md

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ int maxProfit(vector<int>& prices) {
5454
5555
这 6 道题目是有共性的,我们只需要抽出来力扣第 188 题「买卖股票的最佳时机 IV」进行研究,因为这道题是最泛化的形式,其他的问题都是这个形式的简化,看下题目:
5656
57-
![](https://labuladong.github.io/pictures/股票问题/title.png)
57+
<Problem slug="best-time-to-buy-and-sell-stock-iv" />
5858
5959
第一题是只进行一次交易,相当于 `k = 1`;第二题是不限交易次数,相当于 `k = +infinity`(正无穷);第三题是只进行 2 次交易,相当于 `k = 2`;剩下两道也是不限次数,但是加了交易「冷冻期」和「手续费」的额外条件,其实就是第二题的变种,都很容易处理。
6060
@@ -181,7 +181,7 @@ dp[i][k][1] = max(dp[i-1][k][1], dp[i-1][k-1][0] - prices[i])
181181

182182
**第一题,先说力扣第 121 题「买卖股票的最佳时机」,相当于 `k = 1` 的情况**
183183

184-
![](https://labuladong.github.io/pictures/股票问题/title1.png)
184+
<Problem slug="best-time-to-buy-and-sell-stock" />
185185

186186
直接套状态转移方程,根据 base case,可以做一些化简:
187187

@@ -270,7 +270,7 @@ int maxProfit_k_1(int[] prices) {
270270

271271
**第二题,看一下力扣第 122 题「买卖股票的最佳时机 II」,也就是 `k` 为正无穷的情况**
272272

273-
![](https://labuladong.github.io/pictures/股票问题/title2.png)
273+
<Problem slug="best-time-to-buy-and-sell-stock-ii" />
274274

275275
题目还专门强调可以在同一天出售,但我觉得这个条件纯属多余,如果当天买当天卖,那利润当然就是 0,这不是和没有进行交易是一样的吗?这道题的特点在于没有给出交易总数 `k` 的限制,也就相当于 `k` 为正无穷。
276276

@@ -322,7 +322,7 @@ int maxProfit_k_inf(int[] prices) {
322322

323323
**第三题,看力扣第 309 题「最佳买卖股票时机含冷冻期」,也就是 `k` 为正无穷,但含有交易冷冻期的情况**
324324

325-
![](https://labuladong.github.io/pictures/股票问题/title3.png)
325+
<Problem slug="best-time-to-buy-and-sell-stock-with-cooldown" />
326326

327327
和上一道题一样的,只不过每次 `sell` 之后要等一天才能继续交易,只要把这个特点融入上一题的状态转移方程即可:
328328

@@ -381,7 +381,7 @@ int maxProfit_with_cool(int[] prices) {
381381

382382
**第四题,看力扣第 714 题「买卖股票的最佳时机含手续费」,也就是 `k` 为正无穷且考虑交易手续费的情况**
383383

384-
![](https://labuladong.github.io/pictures/股票问题/title4.png)
384+
<Problem slug="best-time-to-buy-and-sell-stock-with-transaction-fee" />
385385

386386
每次交易要支付手续费,只要把手续费从利润中减去即可,改写方程:
387387

@@ -435,7 +435,7 @@ int maxProfit_with_fee(int[] prices, int fee) {
435435

436436
**第五题,看力扣第 123 题「买卖股票的最佳时机 III」,也就是 `k = 2` 的情况**
437437

438-
![](https://labuladong.github.io/pictures/股票问题/title5.png)
438+
<Problem slug="best-time-to-buy-and-sell-stock-iii" />
439439

440440
`k = 2` 和前面题目的情况稍微不同,因为上面的情况都和 `k` 的关系不太大:要么 `k` 是正无穷,状态转移和 `k` 没关系了;要么 `k = 1`,跟 `k = 0` 这个 base case 挨得近,最后也没有存在感。
441441

@@ -547,7 +547,7 @@ int maxProfit_k_2(int[] prices) {
547547

548548
**第六题,看力扣第 188 题「买卖股票的最佳时机 IV」,即 `k` 可以是题目给定的任何数的情况**
549549

550-
![](https://labuladong.github.io/pictures/股票问题/title.png)
550+
<Problem slug="best-time-to-buy-and-sell-stock-iv" />
551551

552552
有了上一题 `k = 2` 的铺垫,这题应该和上一题的第一个解法没啥区别,你把上一题的 `k = 2` 换成题目输入的 `k` 就行了。
553553

动态规划系列/编辑距离.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@
3131

3232
力扣第 72 题「编辑距离」就是这个问题,先看下题目:
3333

34-
![](https://labuladong.github.io/pictures/editDistance/title.png)
34+
<Problem slug="edit-distance" />
3535

3636
函数签名如下:
3737

数据结构系列/BST1.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ void traverse(TreeNode root) {
6464

6565
这是力扣第 230 题「二叉搜索树中第 K 小的元素」,看下题目:
6666

67-
![](https://labuladong.github.io/pictures/BST1/title.png)
67+
<Problem slug="kth-smallest-element-in-a-bst" />
6868

6969
这个需求很常见吧,一个直接的思路就是升序排序,然后找第 `k` 个元素呗。BST 的中序遍历其实就是升序排序的结果,找第 `k` 个元素肯定不是什么难事。
7070

@@ -152,7 +152,7 @@ class TreeNode {
152152

153153
力扣第 538 题和 1038 题都是这道题,完全一样,你可以把它们一块做掉。看下题目:
154154

155-
![](https://labuladong.github.io/pictures/BST1/title1.png)
155+
<Problem slug="convert-bst-to-greater-tree" />
156156

157157
题目应该不难理解,比如图中的节点 5,转化成累加树的话,比 5 大的节点有 6,7,8,加上 5 本身,所以累加树上这个节点的值应该是 5+6+7+8=26。
158158

数据结构系列/dijkstra算法.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -503,7 +503,7 @@ Dijkstra 算法的时间复杂度是多少?你去网上查,可能会告诉
503503

504504
第一题是力扣第 743 题「网络延迟时间」,题目如下:
505505

506-
![](https://labuladong.github.io/pictures/dijkstra/title1.jpg)
506+
<Problem slug="network-delay-time" />
507507

508508
函数签名如下:
509509

@@ -615,7 +615,7 @@ int[] dijkstra(int start, List<int[]>[] graph) {
615615

616616
感觉这道题完全没有难度,下面我们再看一道题目,力扣第 1631 题「最小体力消耗路径」:
617617

618-
![](https://labuladong.github.io/pictures/dijkstra/title2.jpg)
618+
<Problem slug="path-with-minimum-effort" />
619619

620620
函数签名如下:
621621

@@ -747,7 +747,7 @@ int minimumEffortPath(int[][] heights) {
747747

748748
最后看一道题吧,力扣第 1514 题「概率最大的路径」,看下题目:
749749

750-
![](https://labuladong.github.io/pictures/dijkstra/title3.jpg)
750+
<Problem slug="path-with-maximum-probability" />
751751

752752
函数签名如下:
753753

数据结构系列/二叉树系列1.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -162,7 +162,7 @@ TreeNode invertTree(TreeNode root) {
162162

163163
这是力扣第 116 题「填充每个二叉树节点的右侧指针」,看下题目:
164164

165-
![](https://labuladong.github.io/pictures/二叉树系列/title1.png)
165+
<Problem slug="populating-next-right-pointers-in-each-node" />
166166

167167
函数签名如下:
168168

@@ -255,7 +255,7 @@ void traverse(Node node1, Node node2) {
255255

256256
这是力扣第 114 题「将二叉树展开为链表」,看下题目:
257257

258-
![](https://labuladong.github.io/pictures/二叉树系列/title2.png)
258+
<Problem slug="flatten-binary-tree-to-linked-list" />
259259

260260
函数签名如下:
261261

数据结构系列/二叉树系列2.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@
5252

5353
先来道简单的,这是力扣第 654 题「最大二叉树」,题目如下:
5454

55-
![](https://labuladong.github.io/pictures/二叉树系列2/title1.png)
55+
<Problem slug="maximum-binary-tree" />
5656

5757
函数签名如下:
5858

@@ -148,7 +148,7 @@ TreeNode build(int[] nums, int lo, int hi) {
148148

149149
力扣第 105 题「从前序和中序遍历序列构造二叉树」就是这道经典题目,面试笔试中常考:
150150

151-
![](https://labuladong.github.io/pictures/二叉树系列2/title3.png)
151+
<Problem slug="construct-binary-tree-from-preorder-and-inorder-traversal" />
152152

153153
函数签名如下:
154154

@@ -339,7 +339,7 @@ TreeNode build(int[] preorder, int preStart, int preEnd,
339339

340340
类似上一题,这次我们利用**后序****中序**遍历的结果数组来还原二叉树,这是力扣第 106 题「从后序和中序遍历序列构造二叉树」:
341341

342-
![](https://labuladong.github.io/pictures/二叉树系列2/title2.png)
342+
<Problem slug="construct-binary-tree-from-inorder-and-postorder-traversal" />
343343

344344
函数签名如下:
345345

数据结构系列/单调栈.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ int[] nextGreaterElement(int[] nums) {
7979

8080
单调栈的使用技巧差不多了,首先来一个简单的变形,力扣第 496 题「下一个更大元素 I」:
8181

82-
![](https://labuladong.github.io/pictures/单调栈/title.jpg)
82+
<Problem slug="next-greater-element-i" />
8383

8484
这道题给你输入两个数组 `nums1``nums2`,让你求 `nums1` 中的元素在 `nums2` 中的下一个更大元素,函数签名如下:
8585

0 commit comments

Comments
 (0)