Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Skip to content

Commit 42c78d9

Browse files
Merge pull request youngyangyang04#1120 from Guicai996/master
Update 0236.二叉树的最近公共祖先.md, 修改了L48-54; Update 0063不同路径II增加空间优化版本c++代码
2 parents 723df08 + 32dada4 commit 42c78d9

File tree

2 files changed

+39
-2
lines changed

2 files changed

+39
-2
lines changed

problems/0063.不同路径II.md

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -155,6 +155,39 @@ public:
155155
* 时间复杂度:$O(n × m)$,n、m 分别为obstacleGrid 长度和宽度
156156
* 空间复杂度:$O(n × m)$
157157
158+
159+
同样我们给出空间优化版本:
160+
```CPP
161+
class Solution {
162+
public:
163+
int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {
164+
if (obstacleGrid[0][0] == 1)
165+
return 0;
166+
vector<int> dp(obstacleGrid[0].size());
167+
for (int j = 0; j < dp.size(); ++j)
168+
if (obstacleGrid[0][j] == 1)
169+
dp[j] = 0;
170+
else if (j == 0)
171+
dp[j] = 1;
172+
else
173+
dp[j] = dp[j-1];
174+
175+
for (int i = 1; i < obstacleGrid.size(); ++i)
176+
for (int j = 0; j < dp.size(); ++j){
177+
if (obstacleGrid[i][j] == 1)
178+
dp[j] = 0;
179+
else if (j != 0)
180+
dp[j] = dp[j] + dp[j-1];
181+
}
182+
return dp.back();
183+
}
184+
};
185+
```
186+
187+
* 时间复杂度:$O(n × m)$,n、m 分别为obstacleGrid 长度和宽度
188+
* 空间复杂度:$O(m)$
189+
190+
158191
## 总结
159192

160193
本题是[62.不同路径](https://programmercarl.com/0062.不同路径.html)的障碍版,整体思路大体一致。

problems/0236.二叉树的最近公共祖先.md

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,9 +45,13 @@
4545

4646
接下来就看如何判断一个节点是节点q和节点p的公共公共祖先呢。
4747

48-
**如果找到一个节点,发现左子树出现结点p,右子树出现节点q,或者 左子树出现结点q,右子树出现节点p,那么该节点就是节点p和q的最近公共祖先。**
48+
**首先最容易想到的一个情况:如果找到一个节点,发现左子树出现结点p,右子树出现节点q,或者 左子树出现结点q,右子树出现节点p,那么该节点就是节点p和q的最近公共祖先。**
4949

50-
使用后序遍历,回溯的过程,就是从低向上遍历节点,一旦发现如何这个条件的节点,就是最近公共节点了。
50+
**但是很多人容易忽略一个情况,就是节点本身p(q),它拥有一个子孙节点q(p)。**
51+
52+
使用后序遍历,回溯的过程,就是从低向上遍历节点,一旦发现满足第一种情况的节点,就是最近公共节点了。
53+
54+
**但是如果p或者q本身就是最近公共祖先呢?其实只需要找到一个节点是p或者q的时候,直接返回当前节点,无需继续递归子树。如果接下来的遍历中找到了后继节点满足第一种情况则修改返回值为后继节点,否则,继续返回已找到的节点即可。为什么满足第一种情况的节点一定是p或q的后继节点呢?大家可以仔细思考一下。**
5155

5256
递归三部曲:
5357

0 commit comments

Comments
 (0)