佇列 & 棧//島嶼的個數
阿新 • • 發佈:2018-11-11
給定一個由 '1'
(陸地)和 '0'
(水)組成的的二維網格,計算島嶼的數量。一個島被水包圍,並且它是通過水平方向或垂直方向上相鄰的陸地連線而成的。你可以假設網格的四個邊均被水包圍。
示例 1:
輸入: 11110 11010 11000 00000 輸出: 1
示例 2:
輸入: 11000 11000 00100 00011 輸出: 3
class Solution { public int numIslands(char[][] grid) { if(grid.length==0||grid[0].length==0) return 0; int m = grid.length; int n = grid[0].length; int res = 0; for(int i = 0; i < m; i++){ for(int j = 0; j < n; j++){ if(grid[i][j] == '1') { dfs(grid,i,j); res++; } } } return res; } public void dfs(char[][] g, int x, int y){ if(x<0||x>=g.length) return ; if(y<0||y>=g[0].length) return ; if(g[x][y]!='1') return ; g[x][y] = '0'; dfs(g,x+1,y); dfs(g,x-1,y); dfs(g,x,y+1); dfs(g,x,y-1); } }
class Solution { public: int numIslands(vector<vector<char> > &grid) { if (grid.empty() || grid[0].empty()) return 0; int m = grid.size(), n = grid[0].size(), res = 0; vector<vector<bool> > visited(m, vector<bool>(n, false)); for (int i = 0; i < m; ++i) { for (int j = 0; j < n; ++j) { if (grid[i][j] == '1' && !visited[i][j]) { numIslandsDFS(grid, visited, i, j); ++res; } } } return res; } void numIslandsDFS(vector<vector<char> > &grid, vector<vector<bool> > &visited, int x, int y) { if (x < 0 || x >= grid.size()) return; if (y < 0 || y >= grid[0].size()) return; if (grid[x][y] != '1' || visited[x][y]) return; visited[x][y] = true; numIslandsDFS(grid, visited, x - 1, y); numIslandsDFS(grid, visited, x + 1, y); numIslandsDFS(grid, visited, x, y - 1); numIslandsDFS(grid, visited, x, y + 1); } };