要点:对遍历到了的格子进行标记。
200. 岛屿数量
题目:200. 岛屿数量
如果不让在原数据上修改,就用visited来记录。
class Solution {
public int numIslands(char[][] grid) {
int m=grid.length;
int n=grid[0].length;
int count=0;
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
if(grid[i][j]=='1'){
count++;
dfs(i,j,grid);
}
}
}
return count;
}
private void dfs(int i,int j,char[][] grid){
int m=grid.length;
int n=grid[0].length;
if(i>=0&&j>=0&&i<m&&j<n&&grid[i][j]=='1'){
grid[i][j]='0';
dfs(i+1,j,grid);
dfs(i-1,j,grid);
dfs(i,j+1,grid);
dfs(i,j-1,grid);
}
}
}
695. 岛屿的最大面积
题目:695. 岛屿的最大面积
class Solution {
public int maxAreaOfIsland(int[][] grid) {
if(grid==null||grid.length==0) return 0;
int m=grid.length;
int n=grid[0].length;
int maxArea=0;
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
maxArea=Math.max(maxArea,dfs(grid,i,j));
}
}
return maxArea;
}
private int dfs(int[][] grid,int i,int j){
if(grid==null||grid.length==0) return 0;
int m=grid.length;
int n=grid[0].length;
if(i<0||j<0||i>=m||j>=n||grid[i][j]==0){
return 0;
}
int area=1;
grid[i][j]=0;
area+=dfs(grid,i+1,j);
area+=dfs(grid,i-1,j);
area+=dfs(grid,i,j+1);
area+=dfs(grid,i,j-1);
return area;
}
}
130. 被围绕的区域
题目:130. 被围绕的区域
class Solution {
public void solve(char[][] board) {
int m=board.length;
int n=board[0].length;
for(int i=0;i<m;i++){
if(board[i][0]=='O') dfs(board, i, 0);
if(board[i][n-1]=='O') dfs(board, i, n-1);
}
for(int j=0;j<n;j++){
if(board[0][j]=='O') dfs(board, 0, j);
if(board[m-1][j]=='O') dfs(board, m-1, j);
}
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
if(board[i][j]=='O') board[i][j]='X';
if(board[i][j]=='#') board[i][j]='O';
}
}
}
private void dfs(char[][] board,int i,int j){
int m=board.length;
int n=board[0].length;
if(i<0||j<0||i>=m||j>=n||board[i][j]!='O') return;
board[i][j]='#';
dfs(board, i+1, j);
dfs(board, i-1, j);
dfs(board, i, j+1);
dfs(board, i, j-1);
}
}