Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 7002a61

Browse files
author
lucifer
committed
2 parents 2df8b59 + ef41116 commit 7002a61

File tree

3 files changed

+11
-20
lines changed

3 files changed

+11
-20
lines changed

problems/518.coin-change-2.md

Lines changed: 6 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -51,21 +51,8 @@ https://leetcode-cn.com/problems/coin-change-2/
5151

5252
这个题目和 coin-change 的思路比较类似。
5353

54-
我们还是按照 coin-change 的思路来, 如果将问题画出来大概是这样:
55-
56-
![](https://tva1.sinaimg.cn/large/007S8ZIlly1ghluad2o4xj30fi0c1js9.jpg)
57-
5854
进一步我们可以对问题进行空间复杂度上的优化(这种写法比较难以理解,但是相对更省空间)
5955

60-
![](https://tva1.sinaimg.cn/large/007S8ZIlly1ghluae4gtej30ix0ay3zf.jpg)
61-
62-
> 这里用动图会更好理解, 有时间的话我会做一个动图出来, 现在大家脑补一下吧
63-
64-
## 关键点解析
65-
66-
- 动态规划
67-
68-
- 子问题
6956

7057
用 dp[i] 来表示组成 i 块钱,需要最少的硬币数,那么
7158

@@ -128,6 +115,10 @@ return dp[dp.length - 1];
128115
// 正确的写法应该是内外循环调换一下, 具体可以看下方代码区
129116
```
130117

118+
## 关键点解析
119+
120+
- 动态规划
121+
131122
## 代码
132123

133124
代码支持:Python3,JavaScript:
@@ -184,15 +175,15 @@ class Solution:
184175
- 时间复杂度:$$O(amount)$$
185176
- 空间复杂度:$$O(amount * len(coins))$$
186177

187-
## 扩展
178+
## 扩展1
188179

189180
这是一道很简单描述的题目, 因此很多时候会被用到大公司的电面中。
190181

191182
相似问题:
192183

193184
[322.coin-change](./322.coin-change.md)
194185

195-
## 附录
186+
## 扩展2
196187

197188
Python 二维解法(不推荐,但是可以帮助理解):
198189

problems/84.largest-rectangle-in-histogram.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -144,7 +144,7 @@ class Solution:
144144

145145
实际上,读完第二种方法的时候,你应该注意到了。我们的核心是求左边第一个比 i 小的和右边第一个比 i 小的。 如果你熟悉单调栈的话,那么应该会想到这是非常适合使用单调栈来处理的场景。
146146

147-
从左到右遍历柱子,对于每一个柱子,我们想找到第一个高度小于它的柱子,那么我们就可以使用一个单调递增栈来实现。 如果柱子大于栈顶的柱子,那么说明不是我们要找的柱子,我们把它塞进去继续遍历,如果比栈顶小,那么我们就找到了第一个小于的柱子。 **对于栈顶元素,其右边第一个小于它的就是当前遍历到的柱子,左边第一个小于它的就是栈中下一个要被弹出的元素**,因此以当前栈顶为最小柱子的面积为**当前栈顶的柱子高度 \* (当前遍历到的柱子索引 - 1 - 栈中下一个要被弹出的元素索引 - 1 + 1)**
147+
从左到右遍历柱子,对于每一个柱子,我们想找到第一个高度小于它的柱子,那么我们就可以使用一个单调递增栈来实现。 如果柱子大于栈顶的柱子,那么说明不是我们要找的柱子,我们把它塞进去继续遍历,如果比栈顶小,那么我们就找到了第一个小于的柱子。 **对于栈顶元素,其右边第一个小于它的就是当前遍历到的柱子,左边第一个小于它的就是栈中下一个要被弹出的元素**,因此以当前栈顶为最小柱子的面积为**当前栈顶的柱子高度 \* (当前遍历到的柱子索引 - 1 - (栈中下一个要被弹出的元素索引 + 1) + 1)**,化简一下就是 **当前栈顶的柱子高度 \* (当前遍历到的柱子索引 - 栈中下一个要被弹出的元素索引 - 1)**
148148

149149
这种方法只需要遍历一次,并用一个栈。由于每一个元素最多进栈出栈一次,因此时间和空间复杂度都是$$O(N)$$
150150

@@ -181,8 +181,8 @@ class Solution:
181181
for i in range(n + 2):
182182
while st and heights[st[-1]] > heights[i]:
183183
a = heights[st[-1]]
184-
# 如果没有前面的哨兵,这里可能会越界。
185184
st.pop()
185+
# 如果没有前面的哨兵,这里的 st[-1] 可能会越界。
186186
ans = max(ans, a * (i - 1 - st[-1]))
187187
st.append(i)
188188
return ans

problems/85.maximal-rectangle.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,8 @@ https://leetcode-cn.com/problems/maximal-rectangle/
5353

5454
这样我们就可以使用`84. 柱状图中最大的矩形` 中的解法来进行了,这里我们使用单调栈来解。
5555

56+
下面的代码直接将 84 题的代码封装成 API 调用了。
57+
5658
## 代码
5759

5860
```python
@@ -87,6 +89,4 @@ class Solution:
8789
- 时间复杂度:$$O(M * N)$$
8890
- 空间复杂度:$$O(N)$$
8991

90-
欢迎关注我的公众号《脑洞前端》获取更多更新鲜的 LeetCode 题解
91-
92-
![](https://tva1.sinaimg.cn/large/007S8ZIlly1ghlu7e8zulj31bi0hcq5s.jpg)
92+
以上就是本文的全部内容了。大家对此有何看法,欢迎给我留言,我有时间都会一一查看回答。更多算法套路可以访问我的 LeetCode 题解仓库:https://github.com/azl397985856/leetcode 。 目前已经 38K star 啦。大家也可以关注我的公众号《力扣加加》带你啃下算法这块硬骨头。

0 commit comments

Comments
 (0)