leetcode算法题:岛屿数量

leetcode算法题200
链接:https://leetcode.cn/problems/number-of-islands

题目

你一个由 ‘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

解法

1、感染

	public static int numIslands(char[][] grid) {int num = 0;int X = grid.length;for (int i = 0; i < X; i++) {int Y = grid[i].length;for (int j = 0; j < Y; j++) {if (grid[i][j] == '1') {num++;// 填充设置岛屿infect(grid, i, j);}}}return num;}public static void infect(char[][] grid, int x, int y) {if (x < 0 || x == grid.length || y < 0 || y == grid[0].length || grid[x][y] != '1') {return;}grid[x][y] = '0';infect(grid, x - 1, y);infect(grid, x + 1, y);infect(grid, x, y - 1);infect(grid, x, y + 1);}

2、并查集

和之前的省份数量有点类似,这里取巧了一下,使用一维数组来存储所有情况,通过x * col + y算出下标

	public static int numIslands2(char[][] grid) {if (null == grid || grid.length == 0) {return 0;}int row = grid.length;int col = grid[0].length;UnionFind unionFind = new UnionFind(grid);// 0列特殊处理,后面不用判断边界for (int i = 1; i < row; i++) {if (grid[i - 1][0] == '1' && grid[i][0] == '1') {unionFind.union(i - 1, 0, i, 0);}}// 0行特殊处理,后面不用判断边界for (int i = 1; i < col; i++) {if (grid[0][i - 1] == '1' && grid[0][i] == '1') {unionFind.union(0, i - 1, 0, i);}}for (int i = 1; i < grid.length; i++) {for (int j = 1; j < grid[i].length; j++) {if (grid[i][j] == '1') {if (grid[i - 1][j] == '1') {unionFind.union(i, j, i - 1, j);}if (grid[i][j - 1] == '1') {unionFind.union(i, j, i, j - 1);}}}}return unionFind.getSize();}public static class UnionFind {private int[] parents;private int[] childSizes;/*** 每行有多少个*/private int col;/*** 一共有多少个集合(岛)*/private int size;public UnionFind(char[][] data) {int row = data.length;col = data[0].length;int len = row * col;parents = new int[len];childSizes = new int[len];for (int i = 0; i < row; i++) {for (int j = 0; j < col; j++) {if (data[i][j] == '1') {int index = getIndex(i, j);parents[index] = index;childSizes[index] = 1;size++;}}}}//	坐标换成点 (x,y)->pointpublic int getIndex(int x, int y) {return x * col + y;}public int findParent(int index) {Stack<Integer> stack = new Stack<>();while (index != parents[index]) {stack.push(index);index = parents[index];}while (!stack.isEmpty()) {parents[stack.pop()] = index;}return index;}public void union(int x1, int y1, int x2, int y2) {int index1 = getIndex(x1, y1);int index2 = getIndex(x2, y2);int parent1 = findParent(index1);int parent2 = findParent(index2);if (parent1 != parent2) {if (childSizes[parent1] >= childSizes[parent2]) {childSizes[parent1] += childSizes[parent2];parents[parent2] = parent1;} else {childSizes[parent2] += childSizes[parent1];parents[parent1] = parent2;}size--;}}public int getSize() {return size;}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/221552.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux主机自动注册NPS客户端(脚本化)

参考官方对API使用方法的定义&#xff1a;https://ehang-io.github.io/nps/#/ 1、首先必须要在配置文件中开启 auth_key 并配置一个合适的密钥 2、修改脚本中的可变量参数&#xff0c;以适配自己的环境 #!/bin/bash # 脚本使用说明&#xff1a;# 脚本名称&#xff1a;npc_cr…

+0和不+0的性能差异

前几日&#xff0c;有群友转发了某位技术大佬的weibo。并在群里询问如下两个函数哪个执行的速度比较快&#xff08;weibo内容&#xff09;。 func g(n int, ch chan<- int) {r : 0for i : 0; i < n; i {r i}ch <- r 0 }func f(n int, ch chan<- int) {r : 0for …

基于Microchip 光伏逆变器方案

小编杂谈新能源已经完成了至少5期的博文了&#xff0c;Boss告诉小编&#xff0c;如果还不介绍我们的产品和方案&#xff0c;黄花菜都凉了&#xff0c;所以小编这期博文就重点介绍一下Microchip在储能上的产品介绍&#xff0c;重点聊聊Microchip储能中使用的光伏逆变器的解决方案…

期末数组函数加强练习

前言&#xff1a;由于时间问题&#xff0c;部分题解取自网友&#xff0c;但都是做过的好题。 对于有些用c实现的题目&#xff0c;可以转化成c实现&#xff0c;cin看成c的读入&#xff0c;可以用scanf&#xff0c;输出cout看作printf&#xff0c;endl即换行符 开胃菜&#xff…

PHP和go搭建分布式

分布式系统是指由多台计算机组成的网络系统&#xff0c;这些计算机通过网络进行通信和协作&#xff0c;共同完成一个任务。在分布式系统中&#xff0c;通信和数据共享是非常重要的&#xff0c;因此需要使用一些特定的技术和工具进行构建和管理。 PHP和Go都是非常流行的编程语言…

ES6原生音乐播放器(有接口)

视频展示 ES6音乐播放器 项目介绍 GutHub地址&#xff1a;GitHub - baozixiangqianchong/ES6_MusicPlayer: 音乐播放器 ES6_MusicPlayer 是基于JavaScriptES6Ajax等通过原生构建的项目。能够充分锻炼JS能力。 本项目有主页、详情页、歌单页面三部分组成 ├── assets&…

跨域的解决方式(java后端)

文章目录 一、跨域介绍1、什么是跨域2、为什么会产生跨域 二、简单请求和非简单请求1、简单请求2、非简单请求2.1、预检请求2.2、预检请求的回应2.3、浏览器的正常请求和回应 三、CrossOrigin注解1、CrossOrigin源码2、CorsRegistry方式3、CorsFilter过滤器4、自定义过滤器 一、…

Knowledge Distillation from A Stronger Teacher(NeurIPS 2022)论文解读

paper&#xff1a;Knowledge Distillation from A Stronger Teacher official implementation&#xff1a;https://github.com/hunto/dist_kd 前言 知识蒸馏通过将教师的知识传递给学生来增强学生模型的性能&#xff0c;我们自然会想到&#xff0c;是否教师的性能越强&…

java面试题-String、StringBuffer、StringBuilder区别

远离八股文&#xff0c;面试大白话&#xff0c;通俗且易懂 看完后试着用自己的话复述出来。有问题请指出&#xff0c;有需要帮助理解的或者遇到的真实面试题不知道怎么总结的也请评论中写出来&#xff0c;大家一起解决。 java面试题汇总-目录-持续更新中 面试官&#xff1a;Str…

【操作系统导论】内存篇——分页

引入 采用 「分段」 的方式&#xff0c;将空间切成 不同长度的分片&#xff0c;会出现 碎片化 问题&#xff0c;随着时间推移&#xff0c;分配内存会越来越困难。 因此&#xff0c;值得考虑「分页」的方法&#xff1a; 将空间分割成 固定长度的分片 &#xff1b; 将物理内存…

python列表的循环遍历

数据容器&#xff1a;一个可以存储多个元素的Python数据类型 有哪些数据容器&#xff1a;list&#xff08;列表&#xff09;&#xff0c;tuple&#xff08;元组&#xff09;&#xff0c;str&#xff08;字符串&#xff09;&#xff0c;set&#xff08;集合&#xff09;&#x…

第三方电脑小爱同学用快捷键唤醒

第三方电脑安装小爱同学-CSDN博客 请结合之前安装小爱同学的教程安装过程请提前取消windows更新 安装完成之后登录账号即可使用 Ahk2.0 下载地址&#xff1a;https://www.autohotkey.com/download/ahk-v2.zip 打开链接即可自动下载&#xff0c;下载后解压出来点击install.cmd安…

微信公众服务号升级订阅号

服务号和订阅号有什么区别&#xff1f;服务号转为订阅号有哪些作用&#xff1f;首先我们要知道服务号和订阅号有什么区别。服务号侧重于对用户进行服务&#xff0c;每月可推送4次&#xff0c;每次最多8篇文章&#xff0c;发送的消息直接显示在好友列表中。订阅号更侧重于信息传…

java飞翔的鸟游戏

A.准备工作 Bird类 Column类 BirdGame类 Ground类 B.中间过程 准备工作&#xff1a; 安装Java开发环境&#xff08;JDK&#xff09;。选择一个集成开发环境&#xff08;IDE&#xff09;&#xff0c;如Eclipse、IntelliJ IDEA或NetBeans。 创建项目&#xff1a; 在IDE中创建一个…

MFC 调用.NET类库Com Dll,Activex Dll

Visual Studio 2022 MFC 调用Com Dll&#xff08;VS2010通过VB.NET生成的DLL&#xff09; 背景 简单介绍一下背景把&#xff0c;这样如果我所遇到的实际情况跟你所面临的处境有些许相似的话或许可以帮助到你&#xff01; 通过Excel VBA开发了一款工具&#xff0c;当然是通过…

数据结构和算法(全)

1.了解数据结构和算法 1.1 二分查找 二分查找&#xff08;Binary Search&#xff09;是一种在有序数组中查找特定元素的搜索算法。它的基本思想是将数组分成两半&#xff0c;然后比较目标值与中间元素的大小关系&#xff0c;从而确定应该在左半部分还是右半部分继续查找。这个…

Classifier Guidance 与 Classifier-Free Guidance

Classifier Guidance 与 Classifier-Free Guidance DDPM 终于把 diffusion 模型做 work 了&#xff0c;但无条件的生成在现实中应用场景不多&#xff0c;我们终归还是要可控的图像生成。本文简要介绍两篇关于 diffusion 模型可控生成的工作。其中 Classifier-Free Guidance 的…

一文了解java中volatile关键字

认识volatile volatile关键字的作用有两个&#xff1a;变量修改对其他线程立即可见、禁止指令重排。 第二个作用我们后面再讲&#xff0c;先主要讲一下第一个作用。通俗点来说&#xff0c;就是我在一个线程对一个变量进行了修改&#xff0c;那么其他线程马上就可以知道我修改…

jquery 实现倒计时60秒

jquery 实现倒计时60秒 <!DOCTYPE html> <html><head><meta http-equiv"content-type" content"text/html; charsetUTF-8"><meta content"widthdevice-width,initial-scale1.0,maximum-scale1.0,user-scalableno" i…

树莓派zero w入坑指南

树莓派zero w入坑指南 入坑契机 说起创客不得不提到开源硬件Raspberry Pi(树莓派)。它是一款基于ARM的微型电脑主板&#xff0c;以MicroSD卡为硬盘&#xff0c;提供HDMI和USB等外部接口&#xff0c;可连接显示器和键鼠。以上部件全部整合在一张仅比信用卡稍大的主板上&#x…