2021-04-18:给定一个二维数组matrix,里面的值不是1就是0,上、下、左、右相邻的1认为是一片岛,返回matrix中岛的数量。
2021-04-18:给定一个二维数组matrix,里面的值不是1就是0,上、下、左、右相邻的1认为是一片岛,返回matrix中岛的数量。
福大大 答案2021-04-18:
并查集。
代码用golang编写。代码如下:
package main
import "fmt"
func main() {
arr := [][]byte{
{49, 49, 49, 49, 48},
{49, 49, 48, 49, 48},
{49, 49, 48, 49, 48},
{49, 49, 48, 48, 48},
{48, 48, 48, 48, 48}}
ret := numIslands(arr)
fmt.Println(ret)
}
func numIslands(board [][]byte) int {
row := len(board)
col := len(board[0])
uf := NewUnionFind(board)
for j := 1; j < col; j++ {
if board[0][j-1] == '1' && board[0][j] == '1' {
uf.union(0, j-1, 0, j)
}
}
for i := 1; i < row; i++ {
if board[i-1][0] == '1' && board[i][0] == '1' {
uf.union(i-1, 0, i, 0)
}
}
for i := 1; i < row; i++ {
for 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.getSets()
}
type UnionFind2 struct {
parent []int
size []int
help []int
col int
sets int
}
func NewUnionFind(board [][]byte) *UnionFind2 {
ret := &UnionFind2{}
ret.col = len(board[0])
ret.sets = 0
row := len(board)
length := row * ret.col
ret.parent = make([]int, length)
ret.size = make([]int, length)
ret.help = make([]int, length)
for r := 0; r < row; r++ {
for c := 0; c < ret.col; c++ {
if board[r][c] == '1' {
i := ret.index(r, c)
ret.parent[i] = i
ret.size[i] = 1
ret.sets++
}
}
}
return ret
}
// (r,c) -> i
func (this *UnionFind2) index(r int, c int) int {
return r*this.col + c
}
// 原始位置 -> 下标
func (this *UnionFind2) find(i int) int {
hi := 0
for i != this.parent[i] {
this.help[hi] = i
hi++
i = this.parent[i]
}
for hi--; hi >= 0; hi-- {
this.parent[this.help[hi]] = i
}
return i
}
func (this *UnionFind2) union(r1 int, c1 int, r2 int, c2 int) {
i1 := this.index(r1, c1)
i2 := this.index(r2, c2)
f1 := this.find(i1)
f2 := this.find(i2)
if f1 != f2 {
if this.size[f1] >= this.size[f2] {
this.size[f1] += this.size[f2]
this.parent[f2] = f1
} else {
this.size[f2] += this.size[f1]
this.parent[f1] = f2
}
this.sets--
}
}
func (this *UnionFind2) getSets() int {
return this.sets
}
执行结果如下:

2021-04-18:给定一个二维数组matrix,里面的值不是1就是0,上、下、左、右相邻的1认为是一片岛,返回matrix中岛的数量。的更多相关文章
- new一个二维数组
.定义一个二维数组 char **array1 array1 = new char *[x]; for(i=0;i<x;++i) array1[i] = new char[y]; ...用的时候 ...
- ytu 1050:写一个函数,使给定的一个二维数组(3×3)转置,即行列互换(水题)
1050: 写一个函数,使给定的一个二维数组(3×3)转置,即行列互换 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 154 Solved: 112[ ...
- JAVA生成一个二维数组,使中间元素不与相邻的9个元素相等,并限制每一个元素的个数
JAVA生成一个二维数组,使中间元素不与相邻的9个元素相等,并限制每一个元素的个数 示例如下 至少需要九个元素:"A","B","C",&q ...
- [CareerCup] 13.10 Allocate a 2D Array 分配一个二维数组
13.10 Write a function in C called my2DAlloc which allocates a two-dimensional array. Minimize the n ...
- c语言题目:找出一个二维数组的“鞍点”,即该位置上的元素在该行上最大,在该列上最小。也可能没有鞍点
//题目:找出一个二维数组的“鞍点”,即该位置上的元素在该行上最大,在该列上最小.也可能没有鞍点. // #include "stdio.h" #include <stdli ...
- php中向前台js中传送一个二维数组
在php中向前台js中传送一个二维数组,并在前台js接收获取其中值的全过程方法: (1),方法说明:现在后台将数组发送到前台 echo json_encode($result); 然后再在js页面中的 ...
- 如何用一个for循环打印出一个二维数组
思路分析: 二维数组在内存中默认是按照行存储的,比如一个二维数组{{1,2,3,},{4,5,6}},它在内存中存储的顺序就是1.2.3.4.5.6,也就是说,对于这6个数组元素,按照从0到5给它们编 ...
- C语言程序,找出一个二维数组的鞍点。
什么是鞍点????? 鞍点就是在一个二维数组中,某一个数在该行中最大,然而其在该列中又是最小的数,这样的数称为鞍点. 昨天突然在书上看到这样的一道题,就自己尝试着写了一个找出一个二维数组中的鞍点. 好 ...
- <转载>c++中new一个二维数组
原文连接 在c++中定义一个二维数组时有多种方式,下面是几种定义方式的说明:其中dataType 表示数据类型,如int byte long... 1.dataType (*num)[n] = n ...
- C#编写程序,找一找一个二维数组中的鞍点
编写程序,找一找一个二维数组中的鞍点(即该位置上的元素值在行中最大,在该列上最小.有可能数组没有鞍点).要求: 1.二维数组的大小.数组元素的值在运行时输入: 2.程序有友好的提示信息. 代码: us ...
随机推荐
- [vue2 + jointjs + svg-pan-zoom] 节点自动布局渲染 + 拖拽缩放
启动vue项目,执行以下命令安装dagre.graphlib.jointjs.svg-pan-zoom. npm install dagre graphlib jointjs svg-pan-zoom ...
- win10,在桌面点击右键:显示设置和个性化,出现“该文件没有与之关联的应用来执行该操作,请安装应用,若已经安装应用,请在默认应用设置页面中创建关联”
参考:https://zhidao.baidu.com/question/2076100681854702028.html 1. WIN + R 打开运行,并输入 regedit,点击确定,进入注册表 ...
- 查看服务器cpu 核心数
cpu相关信息所在文件是 /proc/cpuinfo 物理cpu数 # grep "physical id" /proc/cpuinfo | sort | uniq | wc -l ...
- WinUI(WASDK)使用ChatGPT和摄像头手势识别结合TTS让机器人更智能
前言 之前写过一篇基于ML.NET的手部关键点分类的博客,可以根据图片进行手部的提取分类,于是我就将手势分类和摄像头数据结合,集成到了我开发的电子脑壳软件里. 电子脑壳是一个为稚晖君开源的桌面机器人E ...
- Python3程序捕获Ctrl+C终止信号
技术背景 对于一些连续运行或者长时间运行的Python程序而言,如服务器的后端,或者是长时间运行的科学计算程序.当我们涉及到一些中途退出的操作时,比如使用Ctrl+C来退出正在运行的程序.这种场景的出 ...
- (续)关于jsp的小细节们
(续集) 细节四:在浏览界面,点击主键对应的数据时,会跳转到其详细信息界面 这样就实现跳转详情页面啦!(jsp再进入一个servlet文件,获取到当前主键的值,然后再传回到另一个jsp文件,就可以实现 ...
- Axios的js文件的下载教程+相关应用
下载教程来啦! 1.进入GitHub网站,网址在这里:http://github.com 2.去搜索框搜索Axios,得到如下界面: 3.然后选择这里: 会出现如下界面: 4.点击右方的绿色按钮&qu ...
- Java多线程开发CompletableFuture的应用
做Java编程,难免会遇到多线程的开发,但是JDK8这个CompletableFuture类很多开发者目前还没听说过,但是这个类实在是太好用了,了解它的一些用法后相信你会对它爱不释手(呸渣男,咋对谁 ...
- Trie树结构
PrefixTree 208. 实现 Trie (前缀树) Trie(发音类似 "try")或者说 前缀树 是一种树形数据结构,用于高效地存储和检索字符串数据集中的键.这一数据结构 ...
- MySQL--索引的数据结构
1.为什么使用索引 索引是存储引擎用于快速找到数据记录的一种数据结构,就好比一本教科书的目录部分,通过目录中找到对应文章的页面,便可以快速定位到需要的文章,mysql中也是一样的道理,进行数据查找时, ...