【LeetCode】Weekly Contest 162:Number of Closed Islands 判断孤岛

一、概述

输入一个二维数组,元素均为0或1,0表示陆地,1表示海洋,返回孤岛个数。孤岛定义为一连串的陆地,其上下左右均为海洋。孤岛不能与二维数组边缘相连。

服务器搞得我心态爆炸。本来这题可以提交的——那样我就1360/6058,而不是现在的1925/6058,前进600名呢。结果十一点五十开始连不上,气得我差点把电脑砸了。

二、分析

这个题第一眼我看到的时候是懵逼的:

什么叫孤岛啊?怎么判断孤岛啊?

然后发现了孤岛的特征:它是一坨连起来的0,周围全是1,注意只要上下左右四面,不用八方。

然后继续归纳,我挨着边缘,但三面环水的算不算啊?不算。只有严格四面环水的才算。

那么问题清楚了一些:和边缘挨着的叫陆地,陆地都不算。

我们可以先把陆地都找出来,再在其余的地方找孤岛。

怎么找陆地呢?这是个问题。可以先在二维数组,我们叫它地图吧,在地图最外圈走一圈,把所有的0标记为陆地,然后再去内部,和陆地相连的也是陆地。这样做。

如何实现“和陆地相连的也是陆地”?用DFS。DFS从一块陆地出发,之后只要遇到0,就标记为陆地,遇到1就返回。这点很重要。我们称一次DFS为一次污染。

要污染多少次呢?我们绕着地图最外面走一圈,碰到陆地,我们把它标记为-1吧,就开始污染。走完了也就污染完了。

现在看地图,其中有三种元素:-1:陆地;0:岛屿;1:海水。然后开始找岛屿。

找岛屿的方法和找陆地一样:我们这次要遍历一整张地图,遇到岛屿就开始污染,将其标记为t,每次污染完一个岛屿,t递增1。什么叫污染完岛屿呢?DFS完一次啊。当我们遍历完整张地图,那么就将所有的岛屿标记为t、t+1、t+2等等。

返回t即可。

这里有一个技巧,我们将t赋值为10,以和0,1,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值