您的位置:首页 > 其它

leetcode--NumberofIslands

2015-06-21 21:13 295 查看
思路:

从第一行往下对每个'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));
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  union and find