200.岛屿数量
给你一个由 '1'(陆地)和 '0'(水)组成的的二维网格,请你计算网格中岛屿的数量。
岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。
此外,你可以假设该网格的四条边均被水包围。
示例 1:
输入:grid = [ ["1","1","1","1","0"], ["1","1","0","1","0"], ["1","1","0","0","0"], ["0","0","0","0","0"] ] 输出:1
示例 2:
输入:grid = [ ["1","1","0","0","0"], ["1","1","0","0","0"], ["0","0","1","0","0"], ["0","0","0","1","1"] ] 输出:3
提示:
m == grid.lengthn == grid[i].length1 <= m, n <= 300grid[i][j]的值为'0'或'1'
方法一:深度优先搜索
时间复杂度:O(MN)
空间复杂度:O(MN)
1 /** 2 * @param {character[][]} grid 3 * @return {number} 4 */ 5 var numIslands = function(grid) { 6 if (!Array.isArray(grid) || grid.length <= 0 || grid[0].length <= 0) 7 return 0; 8 let rows = grid.length, 9 cols = grid[0].length; 10 let marked = new Array(rows); 11 for (let i = 0; i < marked.length; i++) { 12 marked[i] = new Array(cols).fill(false); 13 } 14 let direction = [ 15 [-1, 0], 16 [0, 1], 17 [1, 0], 18 [0, -1] 19 ]; 20 let count = 0; 21 for (let i = 0; i < rows; i++) { 22 for (let j = 0; j < cols; j++) { 23 if (!marked[i][j] && grid[i][j] === '1') { 24 count++; 25 dfs(i, j); 26 } 27 } 28 } 29 30 function dfs(i, j) { 31 marked[i][j] = true; 32 for (let k = 0; k < direction.length; k++) { 33 let newI = i + direction[k][0]; 34 let newJ = j + direction[k][1]; 35 if (isValid(newI, newJ) && !marked[newI][newJ] && grid[newI][newJ] === '1') { 36 dfs(newI, newJ); 37 } 38 } 39 } 40 41 function isValid(i, j) { 42 return i >= 0 && i < rows && j >= 0 && j < cols; 43 } 44 return count; 45 }
方法二:广度优先搜索
时间复杂度:O(MN)
空间复杂度:O(min(M,N))
1 /** 2 * @param {character[][]} grid 3 * @return {number} 4 */ 5 var numIslands = function(grid) { 6 if (!Array.isArray(grid) || grid.length <= 0 || grid[0].length <= 0) 7 return 0; 8 let rows = grid.length, 9 cols = grid[0].length; 10 let marked = new Array(rows); 11 for (let i = 0; i < marked.length; i++) { 12 marked[i] = new Array(cols).fill(false); 13 } 14 let direction = [ 15 [-1, 0], 16 [0, 1], 17 [1, 0], 18 [0, -1] 19 ]; 20 let count = 0; 21 let queue = []; 22 for (let i = 0; i < rows; i++) { 23 for (let j = 0; j < cols; j++) { 24 if (!marked[i][j] && grid[i][j] === '1') { 25 count++; 26 queue.push([i, j]); 27 marked[i][j] = true; 28 while (queue.length > 0) { 29 let [curI, curJ] = queue.pop(); 30 for (let k = 0; k < direction.length; k++) { 31 let newI = curI + direction[k][0]; 32 let newJ = curJ + direction[k][1]; 33 if (isValid(newI, newJ) && !marked[newI][newJ] && grid[newI][newJ] === '1') { 34 queue.push([newI, newJ]); 35 marked[newI][newJ] = true; 36 } 37 } 38 } 39 } 40 } 41 } 42 43 function isValid(i, j) { 44 return i >= 0 && i < rows && j >= 0 && j < cols; 45 } 46 return count; 47 }

浙公网安备 33010602011771号