File tree Expand file tree Collapse file tree 2 files changed +39
-2
lines changed Expand file tree Collapse file tree 2 files changed +39
-2
lines changed Original file line number Diff line number Diff line change @@ -155,6 +155,39 @@ public:
155
155
* 时间复杂度:$O(n × m)$,n、m 分别为obstacleGrid 长度和宽度
156
156
* 空间复杂度:$O(n × m)$
157
157
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
+
158
191
## 总结
159
192
160
193
本题是[ 62.不同路径] ( https://programmercarl.com/0062.不同路径.html ) 的障碍版,整体思路大体一致。
Original file line number Diff line number Diff line change 45
45
46
46
接下来就看如何判断一个节点是节点q和节点p的公共公共祖先呢。
47
47
48
- ** 如果找到一个节点,发现左子树出现结点p,右子树出现节点q,或者 左子树出现结点q,右子树出现节点p,那么该节点就是节点p和q的最近公共祖先。**
48
+ ** 首先最容易想到的一个情况: 如果找到一个节点,发现左子树出现结点p,右子树出现节点q,或者 左子树出现结点q,右子树出现节点p,那么该节点就是节点p和q的最近公共祖先。**
49
49
50
- 使用后序遍历,回溯的过程,就是从低向上遍历节点,一旦发现如何这个条件的节点,就是最近公共节点了。
50
+ ** 但是很多人容易忽略一个情况,就是节点本身p(q),它拥有一个子孙节点q(p)。**
51
+
52
+ 使用后序遍历,回溯的过程,就是从低向上遍历节点,一旦发现满足第一种情况的节点,就是最近公共节点了。
53
+
54
+ ** 但是如果p或者q本身就是最近公共祖先呢?其实只需要找到一个节点是p或者q的时候,直接返回当前节点,无需继续递归子树。如果接下来的遍历中找到了后继节点满足第一种情况则修改返回值为后继节点,否则,继续返回已找到的节点即可。为什么满足第一种情况的节点一定是p或q的后继节点呢?大家可以仔细思考一下。**
51
55
52
56
递归三部曲:
53
57
You can’t perform that action at this time.
0 commit comments