From c544dcadf55b78524a25f44ea0537aa9c6192ab6 Mon Sep 17 00:00:00 2001 From: Hiro Funatsuka Date: Mon, 25 May 2026 23:29:52 +0900 Subject: [PATCH] Solve number of islands --- 200_number_of_islands/problem.md | 1 + 200_number_of_islands/step1.md | 36 ++++++++++++++++++++++++++++++++ 200_number_of_islands/step2.md | 34 ++++++++++++++++++++++++++++++ 200_number_of_islands/step3.md | 33 +++++++++++++++++++++++++++++ 4 files changed, 104 insertions(+) create mode 100644 200_number_of_islands/problem.md create mode 100644 200_number_of_islands/step1.md create mode 100644 200_number_of_islands/step2.md create mode 100644 200_number_of_islands/step3.md diff --git a/200_number_of_islands/problem.md b/200_number_of_islands/problem.md new file mode 100644 index 0000000..1e2627f --- /dev/null +++ b/200_number_of_islands/problem.md @@ -0,0 +1 @@ +## 問題: [200. Number of Islands](https://leetcode.com/problems/number-of-islands/description/) diff --git a/200_number_of_islands/step1.md b/200_number_of_islands/step1.md new file mode 100644 index 0000000..8eb41e3 --- /dev/null +++ b/200_number_of_islands/step1.md @@ -0,0 +1,36 @@ +# Step 1 + +- 各セルで条件を満たす場合、dfsを行う + - dfs + - セルが1、まだ訪れていない、かつ範囲内だったら、counterを1増やして上下左右に行き、次のセルでも同じことを繰り返す + +```python +class Solution: + def numIslands(self, grid: List[List[str]]) -> int: + rows = len(grid) + columns = len(grid[0]) + visited = set() + num_islands = 0 + + def dfs(r, c): + if (r, c) not in visited and r >= 0 and r < rows and c >= 0 and c < columns and grid[r][c] == "1": + visited.add((r, c)) + dfs(r + 1, c) + dfs(r - 1, c) + dfs(r, c + 1) + dfs(r, c - 1) + + for r in range(rows): + for c in range(columns): + if grid[r][c] == "1" and (r, c) not in visited: + num_islands += 1 + dfs(r, c) + + return num_islands +``` + +時間計算量: $O(mn)$ + +空間計算量: $O(mn)$ + +アルゴリズム最大実行時間(概算): 時間計算量 / Pythonの1秒あたりの計算ステップ数 -> $(300 \times 300) \div 10,000,000 = 0.001 (s)$ diff --git a/200_number_of_islands/step2.md b/200_number_of_islands/step2.md new file mode 100644 index 0000000..7a2008f --- /dev/null +++ b/200_number_of_islands/step2.md @@ -0,0 +1,34 @@ +# Step 2 + +```python +class Solution: + def numIslands(self, grid: List[List[str]]) -> int: + rows = len(grid) + columns = len(grid[0]) + directions = [[1, 0], [-1, 0], [0, 1], [0, -1]] + visited = set() + num_islands = 0 + + def dfs(r, c): + if not (0 <= r < rows and 0 <= c < columns): + return + if grid[r][c] != "1" or (r, c) in visited: + return + visited.add((r, c)) + for dr, dc in directions: + dfs(r + dr, c + dc) + + for r in range(rows): + for c in range(columns): + if grid[r][c] == "1" and (r, c) not in visited: + num_islands += 1 + dfs(r, c) + + return num_islands +``` + +時間計算量: $O(mn)$ + +空間計算量: $O(mn)$ + +アルゴリズム最大実行時間(概算): 時間計算量 / Pythonの1秒あたりの計算ステップ数 -> $(300 \times 300) \div 10,000,000 = 0.001 (s)$ diff --git a/200_number_of_islands/step3.md b/200_number_of_islands/step3.md new file mode 100644 index 0000000..1153ea5 --- /dev/null +++ b/200_number_of_islands/step3.md @@ -0,0 +1,33 @@ +# Step 3 + +```python +class Solution: + def numIslands(self, grid: List[List[str]]) -> int: + rows = len(grid) + columns = len(grid[0]) + directions = [[1, 0], [-1, 0], [0, 1], [0, -1]] + visited = set() + num_islands = 0 + + def dfs(r, c): + if not (0 <= r < rows and 0 <= c < columns): + return + if grid[r][c] != "1" or (r, c) in visited: + return + visited.add((r, c)) + for dr, dc in directions: + dfs(r + dr, c + dc) + + for r in range(rows): + for c in range(columns): + if grid[r][c] == "1" and (r, c) not in visited: + num_islands += 1 + dfs(r, c) + + return num_islands +``` +1回目: 5分 9秒 + +2回目: 3分 25秒 + +3回目: 2分 57秒