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));
}
}
从第一行往下对每个'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));
}
}
相关文章推荐
- Varnish Install And Configure
- SQL学习笔记六 union联合结果集使用
- SQL语句的并集UNION 交集JOIN(内连接,外连接)等介绍
- SQLSERVER中union,cube,rollup,cumpute运算符使用说明
- 字符串查找 cmd find命令
- Insert Date and Time into Access
- 拖动Html元素集合 Drag and Drop any item
- Jquery中find与each方法用法实例
- jQuery初学:find()方法及children方法的区别分析
- 学习drag and drop js实现代码经典之作
- union组合结果集时的order问题
- 数据库中union 与union all 的区别
- rsync结合find技巧分享
- MySQL的FIND_IN_SET函数使用方法分享
- Jquery find与filter函数区别 说明
- 深入SQL SERVER合并相关操作Union,Except,Intersect的详解
- MySQL union 语法代码示例分析
- sql Union和Union All的使用方法
- union这个连接是有什么用的和INNER JOIN有什么区别
- And,Where使用提示以及用+进行左关联的提示及注意事项