leetcode--NumberofIslands

思路:

从第一行往下对每个'1'分别对右和下相邻为'1'的元素做union操作,最后每个'1'都和上下左右四个相邻的元素做了union,union and find count数即为island数。

union and find:

有几种实现,时间复杂度取决于find()以及union()函数,find()返回该节点属于哪个集合,union把两个节点对应的两个集合进行归并。

这里采用最优的实现方式,find()函数搜索当前节点的根节点,union分别搜索两个节点的根节点,并把小树归入大树。

假设二维数组共有n个元素,时间复杂度为O(nlogn)

/**
 * Created by marsares on 15/6/21.
 */
public class NumberofIslands {
    int row;
    int column;
    int count;
    int[]index;
    int[]sz;
    public int numIslands(char[][] grid) {
        if(grid==null)return 0;
        row=grid.length;
        if(row==0)return 0;
        column=grid[0].length;
        if(column==0)return 0;
        index=new int[row*column];
        sz=new int[row*column];
        for(int i=0;i<index.length;i++){
            index[i]=i;
            if(grid[i/column][i%column]=='1')count++;
        }
        for(int i=0;i<sz.length;i++){
            sz[i]=1;
        }
        for(int i=0;i<row;i++){
            for(int j=0;j<column;j++){
                if(i==row-1&&j==column-1)continue;
                else if(i==row-1){
                    if(grid[i][j]=='1'&&grid[i][j+1]=='1')union(toIndex(i, j),toIndex(i, j + 1));
                }
                else if(j==column-1){
                    if(grid[i][j]=='1'&&grid[i+1][j]=='1')union(toIndex(i,j),toIndex(i+1,j));
                }
                else{
                    if(grid[i][j]=='1'&&grid[i][j+1]=='1')union(toIndex(i,j),toIndex(i,j+1));
                    if(grid[i][j]=='1'&&grid[i+1][j]=='1')union(toIndex(i,j),toIndex(i+1,j));
                }
            }
        }
        return count;
    }
    public int find(int i){
        while(index[i]!=i){
            i=index[i];
        }
        return i;
    }
    public void union(int a,int b){
        int roota=find(a);
        int rootb=find(b);
        if(roota==rootb)return;
        if(sz[roota]>sz[rootb])index[rootb]=roota;
        else index[roota]=rootb;
        count--;
    }
    private int toIndex(int i,int j){
        return i*column+j;
    }

    public static void main(String[]args){
        NumberofIslands noi=new NumberofIslands();
        char[][]grid={{'1','1','0','0','0'},{'1','1','0','0','0'},{'0','0','1','0','0'},{'0','0','0','1','1'}};
        System.out.println(noi.numIslands(grid));
    }
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值