Skip to content

Commit 89ed564

Browse files
committed
二刷980
1 parent b0b7a7b commit 89ed564

File tree

6 files changed

+106
-14
lines changed

6 files changed

+106
-14
lines changed

docs/0980-unique-paths-iii.adoc

Lines changed: 32 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
[#0980-unique-paths-iii]
22
= 980. 不同路径 III
33

4-
https://leetcode.cn/problems/unique-paths-iii/[LeetCode - 980. 不同路径 III ^]
4+
https://leetcode.cn/problems/unique-paths-iii/[LeetCode - 980. 不同路径 III^]
55

66
在二维网格 `grid` 上,有 4 种类型的方格:
77

@@ -16,8 +16,14 @@ https://leetcode.cn/problems/unique-paths-iii/[LeetCode - 980. 不同路径 III
1616

1717
*示例 1:*
1818

19+
image::images/0980-01.jpg[{image_attr}]
20+
1921
....
20-
输入:[[1,0,0,0],[0,0,0,0],[0,0,2,-1]]
22+
输入:[
23+
[1,0,0,0],
24+
[0,0,0,0],
25+
[0,0,2,-1]
26+
]
2127
输出:2
2228
解释:我们有以下两条路径:
2329
1. (0,0),(0,1),(0,2),(0,3),(1,3),(1,2),(1,1),(1,0),(2,0),(2,1),(2,2)
@@ -26,8 +32,14 @@ https://leetcode.cn/problems/unique-paths-iii/[LeetCode - 980. 不同路径 III
2632

2733
*示例 2:*
2834

35+
image::images/0980-02.jpg[{image_attr}]
36+
2937
....
30-
输入:[[1,0,0,0],[0,0,0,0],[0,0,0,2]]
38+
输入:[
39+
[1,0,0,0],
40+
[0,0,0,0],
41+
[0,0,0,2]
42+
]
3143
输出:4
3244
解释:我们有以下四条路径:
3345
1. (0,0),(0,1),(0,2),(0,3),(1,3),(1,2),(1,1),(1,0),(2,0),(2,1),(2,2),(2,3)
@@ -38,8 +50,13 @@ https://leetcode.cn/problems/unique-paths-iii/[LeetCode - 980. 不同路径 III
3850

3951
*示例 3:*
4052

53+
image::images/0980-03.jpg[{image_attr}]
54+
4155
....
42-
输入:[[0,1],[2,0]]
56+
输入:[
57+
[0,1],
58+
[2,0]
59+
]
4360
输出:0
4461
解释:
4562
没有一条路能完全穿过每一个空的方格一次。
@@ -66,17 +83,19 @@ include::{sourcedir}/_0980_UniquePathsIii.java[tag=answer]
6683
----
6784
--
6885
69-
// 二刷::
70-
// +
71-
// --
72-
// [{java_src_attr}]
73-
// ----
74-
// include::{sourcedir}/_0980_UniquePathsIii_2.java[tag=answer]
75-
// ----
76-
// --
86+
二刷::
87+
+
88+
--
89+
[{java_src_attr}]
90+
----
91+
include::{sourcedir}/_0980_UniquePathsIii_2.java[tag=answer]
92+
----
93+
--
7794
====
7895

7996

8097
== 参考资料
8198

82-
99+
. https://leetcode.cn/problems/unique-paths-iii/solutions/2372252/liang-chong-fang-fa-hui-su-zhuang-tai-ya-26py/[980. 不同路径 III - 两种方法:回溯/状态压缩+记忆化搜索^]
100+
. https://leetcode.cn/problems/unique-paths-iii/solutions/317829/dfs-hui-su-shuang-bai-by-quantum-10/[980. 不同路径 III - dfs + 回溯 (双百)^]
101+
. https://leetcode.cn/problems/unique-paths-iii/solutions/2365866/bu-tong-lu-jing-iii-by-leetcode-solution-cndw/[980. 不同路径 III - 官方题解^]

docs/images/0980-01.jpg

11.2 KB
Loading

docs/images/0980-02.jpg

8.68 KB
Loading

docs/images/0980-03.jpg

5.92 KB
Loading

logbook/202503.adoc

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ endif::[]
8888
|{counter:codes2503e}
8989
|{leetcode_base_url}/unique-paths-iii/[980. 不同路径 III^]
9090
|{doc_base_url}/0980-unique-paths-iii.adoc[题解]
91-
|❌
91+
|❌
9292

9393
|{counter:codes2503e}
9494
|{leetcode_base_url}/minimum-falling-path-sum-ii/[1289. 下降路径最小和 II^]
@@ -2665,6 +2665,11 @@ endif::[]
26652665
|{doc_base_url}/0740-delete-and-earn.adoc[题解]
26662666
|❌ 动态规划。最开始以为理解所有连续数字的和,后来发现理解错了。后来理解正确后,选定一个,删除上下紧挨的两个数,然后再选。这就是打家劫舍的思路了。
26672667

2668+
|{counter:codes2503}
2669+
|{leetcode_base_url}/unique-paths-iii/[980. 不同路径 III^]
2670+
|{doc_base_url}/0980-unique-paths-iii.adoc[题解]
2671+
|✅ 回溯。找到起点,然后向四面八方扩散。
2672+
26682673
|===
26692674

26702675

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
package com.diguage.algo.leetcode;
2+
3+
public class _0980_UniquePathsIii_2 {
4+
// tag::answer[]
5+
6+
/**
7+
* @author D瓜哥 · https://www.diguage.com
8+
* @since 2025-12-21 16:39:19
9+
*/
10+
private int result = 0;
11+
12+
public int uniquePathsIII(int[][] grid) {
13+
int[] start = new int[2];
14+
int[] end = new int[2];
15+
int step = 0;
16+
for (int c = 0; c < grid.length; c++) {
17+
for (int r = 0; r < grid[c].length; r++) {
18+
if (grid[c][r] == 1) {
19+
start[0] = c;
20+
start[1] = r;
21+
} else if (grid[c][r] == 2) {
22+
end[0] = c;
23+
end[1] = r;
24+
} else if (grid[c][r] == 0) {
25+
step++;
26+
}
27+
}
28+
}
29+
backtrack(grid, start, end, step + 1);
30+
return result;
31+
}
32+
33+
private void backtrack(int[][] grid, int[] start, int[] end, int step) {
34+
int column = start[0];
35+
int row = start[1];
36+
if (step == 0 && column == end[0] && row == end[1]) {
37+
result++;
38+
return;
39+
}
40+
if (column < 0 || column >= grid.length
41+
|| row < 0 || row >= grid[column].length
42+
|| step < 0
43+
|| (grid[column][row] != 1 && grid[column][row] != 0)) {
44+
return;
45+
}
46+
int origin = grid[column][row];
47+
int nextStep = step - 1;
48+
grid[column][row] = Integer.MAX_VALUE;
49+
// 上
50+
backtrack(grid, new int[]{column - 1, row}, end, nextStep);
51+
// 下
52+
backtrack(grid, new int[]{column + 1, row}, end, nextStep);
53+
// 左
54+
backtrack(grid, new int[]{column, row - 1}, end, nextStep);
55+
// 右
56+
backtrack(grid, new int[]{column, row + 1}, end, nextStep);
57+
58+
grid[column][row] = origin;
59+
}
60+
// end::answer[]
61+
62+
static void main() {
63+
new _0980_UniquePathsIii_2().uniquePathsIII(new int[][]{
64+
{1, 0, 0, 0},
65+
{0, 0, 0, 0},
66+
{0, 0, 2, -1}});
67+
}
68+
}

0 commit comments

Comments
 (0)