算法题解:岛屿的数量(JAVA代码)

算法题解:岛屿的数量(JAVA代码)

给定一个二维数组,数组元素由0和1组成。0代表水,1代表陆地。陆地可以形成岛。

如果上下左右,包括对角线方向如有相邻的陆地(1)则可以形成岛。如下图所示。

编写一个算法,求岛的数量。

例如:规定一个二维数组:

{1, 1, 0, 0, 0},
{0, 1, 0, 0, 1},
{1, 0, 0, 1, 1},
{0, 0, 0, 0, 0},
{1, 0, 1, 0, 1} 

根据这个二维数组,岛的划分如下图所示,可以划分为5个岛屿。


算法分析

注意:这个问题需要检索8个方向。

与之前不同的是,之前陆地(1)的相邻不包含对角线的4个方向,只能水平方向或者垂直方向。

这是标准问题的一个变化:“计算无向图中连接组件的数量”。最常见的算法设计思想是采用DFS算法,给出一个解。

其实,也可以使用不相交集数据结构来解决这个问题。其思想是将所有“1”的单元格都视为单个集。遍历矩阵并对所有相邻的1个顶点进行并集。


算法设计

package com.bean.algorithmbasic;

/*
 * 这个题目在0-1矩阵中寻找岛的数量时,是向8个方向检索。
 * 不同之前只能
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值