From 3b6378a2e22046ac268b63ac784d5e960b72e50e Mon Sep 17 00:00:00 2001 From: Hiro Funatsuka Date: Mon, 1 Jun 2026 22:47:03 +0900 Subject: [PATCH] Solve max area of island --- 695_max_area_of_island/problem.md | 1 + 695_max_area_of_island/step1.md | 33 +++++++++++++++++++++++++++++++ 695_max_area_of_island/step2.md | 30 ++++++++++++++++++++++++++++ 695_max_area_of_island/step3.md | 29 +++++++++++++++++++++++++++ 4 files changed, 93 insertions(+) create mode 100644 695_max_area_of_island/problem.md create mode 100644 695_max_area_of_island/step1.md create mode 100644 695_max_area_of_island/step2.md create mode 100644 695_max_area_of_island/step3.md diff --git a/695_max_area_of_island/problem.md b/695_max_area_of_island/problem.md new file mode 100644 index 0000000..20f95b8 --- /dev/null +++ b/695_max_area_of_island/problem.md @@ -0,0 +1 @@ +## 問題: [695. Max Area of Island](https://leetcode.com/problems/max-area-of-island/description/) diff --git a/695_max_area_of_island/step1.md b/695_max_area_of_island/step1.md new file mode 100644 index 0000000..44d4ff2 --- /dev/null +++ b/695_max_area_of_island/step1.md @@ -0,0 +1,33 @@ +# Step 1 + +- 各セルで1かつ訪れていなかったらdfsを行う + - dfs + - セルがgridの外、すでに訪れている、もしくは1でない場合は0を返す + - セルが1だったら、隣接するセルのdfsの戻り値に1を足した値を返す + +```python +class Solution: + def maxAreaOfIsland(self, grid: List[List[int]]) -> int: + row_length = len(grid) + column_length = len(grid[0]) + visited = set() + max_area = 0 + + def dfs(r, c): + if not (0 <= r < row_length and 0 <= c < column_length) or (r, c) in visited or grid[r][c] != 1: + return 0 + visited.add((r, c)) + return 1 + dfs(r + 1, c) + dfs(r - 1, c) + dfs(r, c + 1) + dfs(r, c - 1) + + for r in range(row_length): + for c in range(column_length): + max_area = max(max_area, dfs(r, c)) + + return max_area +``` + +時間計算量: $O(mn)$ + +空間計算量: $O(mn)$ + +アルゴリズム最大実行時間(概算): 時間計算量 / Pythonの1秒あたりの計算ステップ数 -> $(50 \times 50) \div 10,000,000 = 0.000025 (s)$ diff --git a/695_max_area_of_island/step2.md b/695_max_area_of_island/step2.md new file mode 100644 index 0000000..07b2d1c --- /dev/null +++ b/695_max_area_of_island/step2.md @@ -0,0 +1,30 @@ +# Step 2 + +```python +class Solution: + def maxAreaOfIsland(self, grid: List[List[int]]) -> int: + num_rows = len(grid) + num_columns = len(grid[0]) + visited = set() + max_area = 0 + + def measure_island(r, c): + if not (0 <= r < num_rows and 0 <= c < num_columns) or (r, c) in visited or grid[r][c] != 1: + return 0 + visited.add((r, c)) + return 1 + measure_island(r + 1, c) + measure_island(r - 1, c) + measure_island(r, c + 1) + measure_island(r, c - 1) + + for r in range(num_rows): + for c in range(num_columns): + if grid[r][c] == 1 and (r, c) not in visited: + max_area = max(max_area, measure_island(r, c)) + + return max_area + +``` + +時間計算量: $O(mn)$ + +空間計算量: $O(mn)$ + +アルゴリズム最大実行時間(概算): 時間計算量 / Pythonの1秒あたりの計算ステップ数 -> $(50 \times 50) \div 10,000,000 = 0.000025 (s)$ diff --git a/695_max_area_of_island/step3.md b/695_max_area_of_island/step3.md new file mode 100644 index 0000000..3bcbb52 --- /dev/null +++ b/695_max_area_of_island/step3.md @@ -0,0 +1,29 @@ +# Step 3 + +```python +class Solution: + def maxAreaOfIsland(self, grid: List[List[int]]) -> int: + num_rows = len(grid) + num_columns = len(grid[0]) + visited = set() + max_area = 0 + + def measure_island(r, c): + if not (0 <= r < num_rows and 0 <= c < num_columns) or (r, c) in visited or grid[r][c] != 1: + return 0 + visited.add((r, c)) + return 1 + measure_island(r + 1, c) + measure_island(r - 1, c) + measure_island(r, c + 1) + measure_island(r, c - 1) + + for r in range(num_rows): + for c in range(num_columns): + if grid[r][c] == 1 and (r, c) not in visited: + max_area = max(max_area, measure_island(r, c)) + + return max_area +``` + +1回目: 4分 0秒 + +2回目: 3分 41秒 + +3回目: 3分 9秒