200.岛屿数量(java)

200.岛屿数量

题目描述

给你一个由 ‘1’(陆地)和 ‘0’(水)组成的的二维网格,请你计算网格中岛屿的数量。

岛屿总是被水包围,并且每座岛屿只能由水平方向或竖直方向上相邻的陆地连接形成。

此外,你可以假设该网格的四条边均被水包围。

示例 1:

输入:
11110
11010
11000
00000
输出: 1
示例 2:

输入:
11000
11000
00100
00011
输出: 3
解释: 每座岛屿只能由水平和/或竖直方向上相邻的陆地连接而成。


解法一:dfs+沉岛思想

思路:

  1. 循环找到’1’的位置,作为新岛屿进行计数
  2. 将其沉为’0’
  3. 将其四周存在的’1’的位置(即该岛屿的一部分)沉为’0’
//带方向数组
class Solution {
    int[] dx={-1,0,1,0};
    int[] dy={0,-1,0,1};
    public int numIslands(char[][] grid) {
        int n=grid.length;
        if(n==0) return 0;
        int m=grid[0].length;
        int ans=0;
        for(int i=0;i<n;i++){
            for(int j=0;j<m;j++){
                if(grid[i][j]=='1'){
                    ans++;
                    dfs(grid,i,j);
                }
            }
        }
        return ans;
    }
    public void dfs(char[][] grid,int i,int j){
        grid[i][j]='0';
        for(int k=0;k<4;k++){
            int x=i+dx[k];
            int y=j+dy[k];
            if(x>=0&&x<grid.length&&y>=0&&y<grid[0].length&&grid[x][y]=='1'){
                dfs(grid,x,y);
            }
        }
    }
}
//不用方向数组
class Solution {
    public int numIslands(char[][] grid) {
        int n=grid.length;
        if(n==0) return 0;
        int m=grid[0].length;
        int ans=0;
        for(int i=0;i<n;i++){
            for(int j=0;j<m;j++){
                if(grid[i][j]=='1'){
                    ans++;
                    dfs(grid,i,j);
                }
            }
        }
        return ans;
    }
    public void dfs(char[][] grid,int i,int j){
        if(i<0||i>=grid.length||j<0||j>=grid[0].length||grid[i][j]=='0'){
            return;
        }
        grid[i][j]='0';
        dfs(grid,i-1,j);
        dfs(grid,i,j-1);
        dfs(grid,i+1,j);
        dfs(grid,i,j+1);
    }
}

200.岛屿数量(java)_第1张图片

解法二:bfs+沉岛思想

class Solution {
    int[] dx={-1,0,1,0};
    int[] dy={0,-1,0,1};
    public int numIslands(char[][] grid) {
        int n=grid.length;
        if(n==0) return 0;
        int m=grid[0].length;
        int ans=0;
        for(int i=0;i<n;i++){
            for(int j=0;j<m;j++){
                if(grid[i][j]=='1'){
                    ans++;
                    //用队列
                    Queue<Integer> queue = new LinkedList();
                    //二维坐标转一维
                    queue.add(i*m+j);
                    while(!queue.isEmpty()){
                        int id=queue.poll();
                        for(int k=0;k<4;k++){
                            //解坐标,引入方向数组
                            int dr=id/m+dx[k];
                            int dc=id%m+dy[k];
                            if(dr>=0&&dr<n&&dc>=0&&dc<m&&grid[dr][dc]=='1'){
                                grid[dr][dc]='0';
                                queue.add(dr*m+dc);
                            }
                        }
                    }
                }
            }
        }
        return ans;
    }
}

200.岛屿数量(java)_第2张图片

解法三:并查集(暂略)

你可能感兴趣的:(leecode)