Leetcode200岛屿数量

题目分析

要区分二维矩阵中的每个1,需要将二维问题转化为一维编号问题。

如果矩阵有m列,位于第i行、第j列的元素对应的一维编号为i乘以m加j。

先将所有的1建成小集合,遍历矩阵,遇到1时,如果其左边或者上边有1则进行合并,最后统计并查集中集合的数量就是岛的数量。

代码求解

java 复制代码
public static int numIslands(char[][] board){
		int n = board.length;
		int m = board[0].length;

		build(n,m,board);
		for(int i=0;i<n;i++){
			for(int j=0;j<m;j++){
				if(board[i][j]=='1'){
					if(j>0&&board[i][j-1]=='1'){
						union(i,j,i,j-1);
					}

					if(i>0&&board[i-1][j]=='1'){
						union(i,j,i-1,j);
					}
				}
			}
		}
		return sets;
	}

	public static int MAXSIZE = 100001;
	public static int[] father = new int[MAXSIZE];
	public static int cols;
	public static int sets;

	public static void build(int n,int m,char[][] board){
		cols = m;
		sets = 0;
		for(int a=0;a<n;a++){
			for(int b=0,index;b<m;b++){
				if(board[a][b]=='1'){
					index = index(a,b);
					father[index]=index;
					sets++;
				}
			}
		}
	}

	public static int index(int a,int b){
		return a*cols+b;
	}

	public static int find(int i){
		if(i!=father[i]){
			father[i]=find(father[i]);
		}
		return father[i];
	}

	public static void union(int a,int b,int c,int d){
		int fx = find(index(a, b));
		int fy = find(index(c, d));
		if(fx!=fy){
			father[fx]=fy;
			sets--;
		}
	}
相关推荐
伍一516 小时前
hiprint-spring-boot打印组件介绍
java·hiprint
神仙别闹11 小时前
基于 C++ 实现(控制台)学生成绩管理系统
开发语言·c++
Wang's Blog11 小时前
Java 接入Redis: 服务启动停止与后台运行配置
java·服务器·redis
此时不提桶,更待何时11 小时前
01-04-B-垃圾回收面试与生产事故实战
java·jvm·面试
伞伞悦读12 小时前
【第36期】Python 目录与路径详解:pathlib、文件遍历、创建、复制、移动和删除风险
开发语言·python
鹿角片ljp13 小时前
KV Cache 解析
java·算法
captain37614 小时前
网络原理(9)-数据链路层
java·网络协议·java-ee
惊讶的猫14 小时前
意图识别置信度和检索重排的分数
java
2601_9669496514 小时前
只拿到股票代码还不够:量化程序到底还需要哪些标的信息?——从数据建模开始理解股票元数据
开发语言·python·数据分析·pandas·量化交易·股票数据·quantdash