题:https://leetcode.com/problems/number-of-islands/description/
题目
Given a 2d grid map of '1’s (land) and '0’s (water), count the number of islands. An island is surrounded by water and is formed by connecting adjacent lands horizontally or vertically. You may assume all four edges of the grid are all surrounded by water.
Example 1:
Input:
11110
11010
11000
00000
Output: 1
Example 2:
Input:
11000
11000
00100
00011
Output: 3
#思路
遍历整个矩阵,当所在位置为‘1’时候,计数count 加一,用DFS对其邻近的位置搜索,若访问位置为‘1’,将其设置为0。
#code
def dfsSearch(grid,i,j,n,m):
if not (0<=i and i<n and 0<=j and j<m and grid[i][j]=='1'):
return
grid[i][j] = '0'
dfsSearch(grid,i,j-1,n,m)
dfsSearch(grid,i,j+1,n,m)
dfsSearch(grid,i-1,j,n,m)
dfsSearch(grid,i+1,j,n,m)
class Solution:
def numIslands(self, grid):
"""
:type grid: List[List[str]]
:rtype: int
"""
n = len(grid)
if n == 0:
return 0
m = len(grid[0])
count = 0
for i in range(n):
for j in range(m):
if grid[i][j]=='1':
count += 1
dfsSearch(grid,i,j,n,m)
return count
java
方法一
class Solution {
static int[][] direction = {{0,1},{0,-1},{1,0},{-1,0}};
int m,n;
public void dfs(char [][]grid,int r,int c){
grid[r][c] ='0';
for(int [] d : direction){
int nr =r + d[0],nc = c + d[1];
if(nr>=0 && nr <m && nc>=0 && nc<n && grid[nr][nc]!='0')
dfs(grid,nr,nc);
}
}
public int numIslands(char[][] grid) {
if(grid == null || grid.length == 0) return 0;
m = grid.length;
n = grid[0].length;
int cnt = 0;
for(int i = 0;i < m;i++)
for(int j = 0;j < n;j++)
if(grid[i][j]!='0'){
cnt++;
dfs(grid,i,j);
}
return cnt;
}
}
方法二
更简洁
class Solution {
int[][] dirs = {{0,1},{0,-1},{1,0},{-1,0}};
private void dfs(char[][] grid,int r,int c){
if(r<0 || r>= grid.length ||c < 0 || c>=grid[r].length || grid[r][c] == '0')
return ;
grid[r][c] = '0';
for(int dir[]:dirs)
dfs(grid,r + dir[0], c + dir[1]);
}
public int numIslands(char[][] grid) {
int res =0;
for(int i = 0 ; i < grid.length;i++)
for(int j = 0 ; j< grid[i].length ;j++)
if(grid[i][j] == '1'){
res++;
dfs(grid,i,j);
}
return res;
}
}