# Leetcode [No. 200] Number of Islands (MEDIUM) 解題心得 + Blind 169 Challenge solved on 2024/02/13 聽說這題是某年群暉intern出現過的白板題,一次過超開心>< + Neetcode150 Challenge solved on 2025/02/19 (Solve second times) ## 題目 https://leetcode.com/problems/number-of-islands/description/ ## 思路 + 這個解法就是用DFS去traverse grid上每一個(x,y) + 為了去確保每個island都走過了,我們需要O(n^2)的複雜度來iterate檢查每一個節點。 + 當我們找到了一個"1",我們就去對那個點做DFS,把DFS走過的點都存起來(visited) ```c++= class Solution { public: int numIslands(vector<vector<char>>& grid) { // use DFS to traverse every pos in grid. int cnt = 0; vector<vector<bool>> visited(grid.size(), vector<bool> (grid[0].size(), false)); for(int i = 0 ; i < grid.size(); i++) { for(int j = 0 ; j < grid[i].size(); j++) { if(!visited[i][j] && grid[i][j] != '0') { DFS(grid, visited, i,j); cnt++; } } } return cnt; } void DFS(vector<vector<char>>& grid, vector<vector<bool>>& visited, int row, int col) { if(grid[row][col] == '1' && !visited[row][col]) { visited[row][col] = true; if(row+1 < grid.size()) { DFS(grid, visited, row+1, col); } if(col+1 < grid[0].size()) { DFS(grid, visited, row, col+1); } if(row-1 >= 0) { DFS(grid, visited, row-1, col); } if(col-1 >= 0) { DFS(grid, visited, row, col-1); } } return; } }; ``` ### 解法分析 + time complexity: O(n*m) ### 執行結果 ![image](https://hackmd.io/_uploads/BJjz1JOj6.jpg) --- ## 第二次挑戰 ```c++= class Solution { public: int numIslands(vector<vector<char>>& grid) { vector<vector<bool>> visited(grid.size(), vector<bool>(grid[0].size(), false)); int cnt = 0; for (int i = 0 ; i < grid.size(); i++) { for (int j = 0; j < grid[0].size(); j++) { if (!visited[i][j] && grid[i][j] == '1') { dfs(i, j, grid, visited); cnt++; } } } return cnt; } void dfs(int r, int c, vector<vector<char>>& grid, vector<vector<bool>>& visited) { if (visited[r][c] == true) return; visited[r][c] = true; if (r + 1 < grid.size() && grid[r+1][c] == '1') { dfs(r + 1, c, grid, visited); } if (r - 1 >= 0 && grid[r-1][c] == '1') { dfs(r - 1, c, grid, visited); } if (c + 1 < grid[0].size() && grid[r][c+1] == '1') { dfs(r, c + 1, grid, visited); } if (c - 1 >= 0 && grid[r][c-1] == '1') { dfs(r, c - 1, grid, visited); } } }; ```