leetcode-岛屿数量(Java实现)

news/2025/1/11 18:01:35/

使用递归算法和并查集两种方式解决岛屿数量

  • LeetCode原题链接
  • 题目描述
  • 递归解法
  • 并查集解法
  • 并查集的知识学习。

LeetCode原题链接

岛屿数量

题目描述

给你一个由 ‘1’(陆地)和 ‘0’(水)组成的的二维网格,请你计算网格中岛屿的数量。
岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。
此外,你可以假设该网格的四条边均被水包围。

示例1:
输入:grid = [
[“1”,“1”,“1”,“1”,“0”],
[“1”,“1”,“0”,“1”,“0”],
[“1”,“1”,“0”,“0”,“0”],
[“0”,“0”,“0”,“0”,“0”]
]
输出:1

示例2:
输入:grid = [
[“1”,“1”,“0”,“0”,“0”],
[“1”,“1”,“0”,“0”,“0”],
[“0”,“0”,“1”,“0”,“0”],
[“0”,“0”,“0”,“1”,“1”]
]
输出:3

提示:
m == grid.length
n == grid[i].length
1 <= m, n <= 300
grid[i][j] 的值为 ‘0’ 或 ‘1’

递归解法

1.解题思路,

我们在遍历这个二维数组时,每次遇到‘1’,我们就去判断这个位置的上下左右的四个位置上是不是还有1,这个就很像二叉树的递归,二叉树递归时,我们会递归左树,递归右树。这个我们去递归上下左右四个位置。

2.代码演示。

 public int numIslands(char[][] grid) {if (grid == null ){return 0;}int num = 0;for (int i = 0 ; i < grid.length;i++){for (int j = 0;j < grid[0].length;j++){//碰到1 再去递归看看周围是不是还有'1'if (grid[i][j] == '1'){num++;processInfect(grid,i,j);}}}return num;}/*** 判断有多少孤岛* @param ints* @param i* @param j* @return*/public static void processInfect(char[][]ints,int i,int j){if (i >= ints.length || j >= ints[0].length){return ;}if (i < 0 || j < 0){return ;}if (ints[i][j] == '0'){return ;}//碰到‘1’把他改成'0' 避免重复去计算。ints[i][j] = '0';//上位置processInfect(ints,i - 1,j);//下processInfect(ints,i + 1,j);//左processInfect(ints,i,j - 1);//右processInfect(ints,i,j + 1);}

并查集解法

1.解题思路

把这个二维数组可以转换成并查集的形式,有’1’的位置我们就初始化成并查集的一个元素。然后把相邻的‘1’全部合并成一块,最后返回还剩几个集合,就是几个岛屿。

2.代码演示

public static int numIslands2(char[][] board) {int row = board.length;int col = board[0].length;UnionFind2 uf = new UnionFind2(board);for (int j = 1; j < col; j++) {if (board[0][j - 1] == '1' && board[0][j] == '1') {uf.union(0, j - 1, 0, j);}}for (int i = 1; i < row; i++) {if (board[i - 1][0] == '1' && board[i][0] == '1') {uf.union(i - 1, 0, i, 0);}}for (int i = 1; i < row; i++) {for (int j = 1; j < col; j++) {if (board[i][j] == '1') {if (board[i][j - 1] == '1') {uf.union(i, j - 1, i, j);}if (board[i - 1][j] == '1') {uf.union(i - 1, j, i, j);}}}}return uf.sets();}//实现并查集public static class UnionFind2 {private int[] parent;private int[] size;private int[] help;//二维数组中,每个单个数组的长度,也就是列的长度private int col;//集合的数量private int sets;//初始化并查集public UnionFind2(char[][] board) {col = board[0].length;sets = 0;int row = board.length;int len = row * col;parent = new int[len];size = new int[len];help = new int[len];for (int r = 0; r < row; r++) {for (int c = 0; c < col; c++) {if (board[r][c] == '1') {int i = index(r, c);parent[i] = i;size[i] = 1;sets++;}}}}// (r,c) -> i 二维数组中的位置转化成一维数组中的下标,// 行号 * 列的长度 + 列所在的位置。private int index(int r, int c) {return r * col + c;}// 原始位置 -> 下标private int find(int i) {int hi = 0;while (i != parent[i]) {help[hi++] = i;i = parent[i];}for (hi--; hi >= 0; hi--) {parent[help[hi]] = i;}return i;}//合并集合public void union(int r1, int c1, int r2, int c2) {int i1 = index(r1, c1);int i2 = index(r2, c2);int f1 = find(i1);int f2 = find(i2);if (f1 != f2) {if (size[f1] >= size[f2]) {size[f1] += size[f2];parent[f2] = f1;} else {size[f2] += size[f1];parent[f1] = f2;}sets--;}}public int sets() {return sets;}}

并查集的知识学习。

并查集专题–Map和数组两种方式实现并查集(Java)

并查集专题–省份数量(leetcode)


http://www.ppmy.cn/news/87399.html

相关文章

【arxiv】关于 SAM 的论文扫读(一)

文章目录 一、阴影检测二、弱监督下的隐蔽物体分割&#xff1a;基于SAM的伪标签和多尺度特征分组三、Instruct2Act&#xff1a;利用大型语言模型将多模态指令映射到机器人动作四、OR-NeRF: Object Removing from 3D Scenes Guided by Multiview Segmentation with Neural Radia…

R语言环境配置指南:详解安装和设置步骤(ChatGPT3.5)

标题&#xff1a;R语言环境配置指南&#xff1a;详解安装和设置步骤 导语&#xff1a; R语言是一种功能强大的统计分析和数据可视化工具&#xff0c;为了充分利用其优势&#xff0c;正确配置R语言环境至关重要。本文将详细介绍如何安装R语言以及配置开发环境&#xff0c;包括选…

two-stage目标检测算法

R-CNN 现在&#xff0c;将目光穿越回2012年&#xff0c;hinton刚刚提出alexnet的时代。 此时&#xff0c;该如何审视目标检测任务&#xff1f; 当时的目标检测采用的是滑动窗口手动特征分类器的思路。 该方法的弱点包括 速度慢 精度差 精度差的问题是由手工特征造成的&am…

QCM6490 多次点击power键才能唤醒屏幕

项目场景&#xff1a; 点击2-3次power键才能唤醒屏幕。 1.gpio 占用&#xff0c;目测最有可能的是gpio占用 导致超时 &#xff08;1.通过添加log定位 2.排查添加的gpio&#xff09;-排除&#xff0c;没有报错也无法唤醒 2.休眠有问题 3.唤醒有问题 4.pmi休眠唤醒异常导致 --对…

HTTP(十)-- HTTP综合案例

目录 1. 项目结构 2. 数据库结构 2.1 建立user表 2.2 配置jbdc.properties文件 2.3 导入JDBCUtils工具类

2023网络安全工程师面试宝典(附答案)

2023年即将过去一半&#xff0c;先来灵魂三连问&#xff1a; 年初定的目标完成多少了&#xff1f;薪资涨了吗&#xff1f;女朋友找到了吗&#xff1f; ​好了&#xff0c;不扎大家的心了&#xff0c;接下来进入正文。 1、SQL注入的原理是什么&#xff1f; SQL注入攻击是通过将…

MySQL数据库进行性能优化的思路

对MySQL数据库进行性能优化的思路可以涵盖以下方面&#xff1a; 索引优化&#xff1a; 索引是提高查询性能的关键。确保表中的关键列和经常用于查询条件的列都被适当地创建了索引。可以使用CREATE INDEX语句添加索引&#xff0c;或者使用ALTER TABLE语句在已有表上添加索引。例…

解码“源启”的昨天、今天和明天

源启是中国电子依托自主计算产业链&#xff0c;采用新一代架构&#xff0c;为金融及重点行业打造的数字化新型基础设施。源启自推出以来受到了广泛关注与热议&#xff0c;本文通过回答因何源启、何为源启以及源启未来如何发展三个问题&#xff0c;与业界分享我们对新型数字基础…