https://leetcode.com/problems/number-of-islands/
本题解法的巧妙之处在于,把含有1的岛合并,这样只要统计1的个数就能知道有多少个岛。另外,本解法直接在传入的gird中保存合并结果,也节约了内存。以下为C++和python的代码,时间复杂度为O(m*n),空间复杂度为O(1)。
struct Solution {
int numIslands(vector<vector<char>>& grid) {
if(grid.empty() || grid[0].empty())
return 0;
int count=0;
int m = grid.size();
int n = grid[0].size();
for(int i=0; i<m; i++){
for(int j=0; j<n; j++){
if(grid[i][j]=='1'){
count++;
merge(grid, i, j);
}
}
}
return count;
}
void merge(vector<vector<char>>& grid, int i, int j){
int m=grid.size();
int n=grid[0].size();
if(i<0 || i>=m || j<0 || j>=n || grid[i][j]!='1')
return;
grid[i][j]='X';
merge(grid, i-1, j);
merge(grid, i+1, j);
merge(grid, i, j-1);
merge(grid, i, j+1);
}
};
class Solution:
def numIslands(self, grid):
if grid == None or len(grid) == 0 or grid[0] == None:
return 0
count = 0
m = len(grid)
n = len(grid[0])
for i in range(m):
for j in range(n):
if grid[i][j] == '1':
count = count + 1
self.merge( grid, i, j )
return count
def merge(self, grid, i, j):
if grid == None or grid[0] == None:
return
m = len(grid)
n = len(grid[0])
if i < 0 or i >= m or j < 0 or j >= n or grid[i][j] != '1':
return
grid[i][j] = 'X'
self.merge(grid, i-1, j)
self.merge(grid, i+1, j)
self.merge(grid, i, j-1)
self.merge(grid, i, j+1)