From 9a5379e3a62b728ace6aeb96734a3579d2b4525a Mon Sep 17 00:00:00 2001 From: Hiro Funatsuka Date: Sun, 10 May 2026 13:30:16 +0900 Subject: [PATCH 1/2] Solve unique paths ii --- 63_unique_paths_ii/problem.md | 1 + 63_unique_paths_ii/step1.md | 33 +++++++++++++++++++++++++++++++++ 63_unique_paths_ii/step2.md | 28 ++++++++++++++++++++++++++++ 63_unique_paths_ii/step3.md | 30 ++++++++++++++++++++++++++++++ 4 files changed, 92 insertions(+) create mode 100644 63_unique_paths_ii/problem.md create mode 100644 63_unique_paths_ii/step1.md create mode 100644 63_unique_paths_ii/step2.md create mode 100644 63_unique_paths_ii/step3.md diff --git a/63_unique_paths_ii/problem.md b/63_unique_paths_ii/problem.md new file mode 100644 index 0000000..dbbf5d3 --- /dev/null +++ b/63_unique_paths_ii/problem.md @@ -0,0 +1 @@ +## 問題: [63. Unique Paths II](https://leetcode.com/problems/unique-paths-ii/description/) diff --git a/63_unique_paths_ii/step1.md b/63_unique_paths_ii/step1.md new file mode 100644 index 0000000..2de2c41 --- /dev/null +++ b/63_unique_paths_ii/step1.md @@ -0,0 +1,33 @@ +# Step 1 + +- ある地点$grid[i][j]$に辿り着けるルートの数は$grid[i - 1][j]$に辿り着くルートの数と$grid[i][j - 1]$に辿り着くルートの数の和である + +```python +class Solution: + def uniquePathsWithObstacles(self, obstacleGrid: List[List[int]]) -> int: + M = len(obstacleGrid) + N = len(obstacleGrid[0]) + + if obstacleGrid[M - 1][N - 1] == 1 or obstacleGrid[0][0] == 1: + return 0 + + prev_row = [0] * N + for i, cell in enumerate(obstacleGrid[0]): + if cell == 0: + prev_row[i] = 1 + else: + break + + for i in range(1, M): + new_row = [0] * N + new_row[0] = prev_row[0] if obstacleGrid[i][0] == 0 else 0 + for j in range(1, N): + if obstacleGrid[i][j] == 0: + new_row[j] = new_row[j - 1] + prev_row[j] + prev_row = new_row + return prev_row[N - 1] +``` + +時間計算量: $O(m \times n)$ + +空間計算量: $O(n)$ diff --git a/63_unique_paths_ii/step2.md b/63_unique_paths_ii/step2.md new file mode 100644 index 0000000..da9cf86 --- /dev/null +++ b/63_unique_paths_ii/step2.md @@ -0,0 +1,28 @@ +# Step 2 + +```python +class Solution: + def uniquePathsWithObstacles(self, obstacleGrid: List[List[int]]) -> int: + number_of_rows = len(obstacleGrid) + number_of_columns = len(obstacleGrid[0]) + + prev_row = [0] * number_of_columns + for i, cell in enumerate(obstacleGrid[0]): + if cell == 0: + prev_row[i] = 1 + else: + break + + for r in range(1, number_of_rows): + new_row = [0] * number_of_columns + new_row[0] = prev_row[0] if obstacleGrid[r][0] == 0 else 0 + for c in range(1, number_of_columns): + if obstacleGrid[r][c] == 0: + new_row[c] = new_row[c - 1] + prev_row[c] + prev_row = new_row + return prev_row[number_of_columns - 1] +``` + +時間計算量: $O(m \times n)$ + +空間計算量: $O(n)$ diff --git a/63_unique_paths_ii/step3.md b/63_unique_paths_ii/step3.md new file mode 100644 index 0000000..a2619f0 --- /dev/null +++ b/63_unique_paths_ii/step3.md @@ -0,0 +1,30 @@ +# Step 3 + +```python +class Solution: + def uniquePathsWithObstacles(self, obstacleGrid: List[List[int]]) -> int: + number_of_rows = len(obstacleGrid) + number_of_columns = len(obstacleGrid[0]) + + prev_row = [0] * number_of_columns + for i, cell in enumerate(obstacleGrid[0]): + if cell == 0: + prev_row[i] = 1 + else: + break + + for r in range(1, number_of_rows): + new_row = [0] * number_of_columns + new_row[0] = prev_row[0] if obstacleGrid[r][0] == 0 else 0 + for c in range(1, number_of_columns): + if obstacleGrid[r][c] == 0: + new_row[c] = new_row[c - 1] + prev_row[c] + prev_row = new_row + return prev_row[number_of_columns - 1] +``` + +1回目: 4分 43秒 + +2回目: 3分 18秒 + +3回目: 3分 29秒 From e42b02475a06b16aa7e150fc67e69e5771ddd73b Mon Sep 17 00:00:00 2001 From: Hiro Funatsuka Date: Sun, 10 May 2026 13:44:29 +0900 Subject: [PATCH 2/2] Refactor code --- 63_unique_paths_ii/step2.md | 14 +++++++------- 63_unique_paths_ii/step3.md | 14 +++++++------- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/63_unique_paths_ii/step2.md b/63_unique_paths_ii/step2.md index da9cf86..a819928 100644 --- a/63_unique_paths_ii/step2.md +++ b/63_unique_paths_ii/step2.md @@ -6,21 +6,21 @@ class Solution: number_of_rows = len(obstacleGrid) number_of_columns = len(obstacleGrid[0]) - prev_row = [0] * number_of_columns + row = [0] * number_of_columns for i, cell in enumerate(obstacleGrid[0]): if cell == 0: - prev_row[i] = 1 + row[i] = 1 else: break for r in range(1, number_of_rows): - new_row = [0] * number_of_columns - new_row[0] = prev_row[0] if obstacleGrid[r][0] == 0 else 0 + row[0] = row[0] if obstacleGrid[r][0] == 0 else 0 for c in range(1, number_of_columns): if obstacleGrid[r][c] == 0: - new_row[c] = new_row[c - 1] + prev_row[c] - prev_row = new_row - return prev_row[number_of_columns - 1] + row[c] += row[c - 1] + else: + row[c] = 0 + return row[number_of_columns - 1] ``` 時間計算量: $O(m \times n)$ diff --git a/63_unique_paths_ii/step3.md b/63_unique_paths_ii/step3.md index a2619f0..529751d 100644 --- a/63_unique_paths_ii/step3.md +++ b/63_unique_paths_ii/step3.md @@ -6,21 +6,21 @@ class Solution: number_of_rows = len(obstacleGrid) number_of_columns = len(obstacleGrid[0]) - prev_row = [0] * number_of_columns + row = [0] * number_of_columns for i, cell in enumerate(obstacleGrid[0]): if cell == 0: - prev_row[i] = 1 + row[i] = 1 else: break for r in range(1, number_of_rows): - new_row = [0] * number_of_columns - new_row[0] = prev_row[0] if obstacleGrid[r][0] == 0 else 0 + row[0] = row[0] if obstacleGrid[r][0] == 0 else 0 for c in range(1, number_of_columns): if obstacleGrid[r][c] == 0: - new_row[c] = new_row[c - 1] + prev_row[c] - prev_row = new_row - return prev_row[number_of_columns - 1] + row[c] += row[c - 1] + else: + row[c] = 0 + return row[number_of_columns - 1] ``` 1回目: 4分 43秒