水域大小 Java_leetcode —— 面试题 16.19. 水域大小

你有一个用于表示一片土地的整数矩阵land,该矩阵中每个点的值代表对应地点的海拔高度。若值为0则表示水域。由垂直、水平或对角连接的水域为池塘。池塘的大小是指相连接的水域的个数。编写一个方法来计算矩阵中所有池塘的大小,返回值需要从小到大排序。

示例:

输入:

[

[0,2,1,0],

[0,1,0,1],

[1,1,0,1],

[0,1,0,1]

]

输出: [1,2,4]

来源:力扣(LeetCode)

链接:https://leetcode-cn.com/problems/pond-sizes-lcci

著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

————————

1、广度优先遍历:

(1)将数组从左往右,从上往下进行遍历,当遇到一个数据是0,即表示海洋时,将该位置放进队列中;初始化一个变量nums,表示以该位置为起点的海洋面积有多大,初始值为nums=1;同时切记将当前位置的海洋的值从0改为-1,表示已经搜索过;

(2)遍历队列,对队列中的每个位置,判断其左上,上,右上,左,右,左下,下,右下八个位置是否是海洋,如果是海洋,则将其位置信息放进队列中,并使num的值加一;同时切记将其海洋值从0变为-1,表示其已经搜索过;

(3)当队列为空时,表示与当前位置相连的海洋已经寻找完毕,将得到的nums值放进一个列表中;这时候需要去寻找下一个点,重复上面(1)-(3)的操作,直到对整个地图搜索完毕;

具体Python代码如下:

class Solution:

def pondSizes(self, land: List[List[int]]) -> List[int]:

rows,cols = len(land),len(land[0]) # 计算行数和列数

if rows==0 or cols==0:

return []

def neighbor(i,j): # 用于寻找当前位置land[i][j]的周围所有数据中是否存在海洋,如果存在则返回其坐标信息

for nr,nc in [[i-1,j],[i+1,j],[i,j-1],[i,j+1],[i-1,j-1],[i-1,j+1],[i+1,j-1],[i+1,j+1]]:

if 0<=nr

2、深度优先遍历

(1)将数组从左往右,从上往下进行遍历,当遇到land[i][j]=0时表示遇到海洋,基于land[i][j]遍历其周围所有的点。深度优先遍历和广度优先遍历不同,广度优先遍历使用队列,遍历时一圈一圈往外遍历。而深度优先遍历时当在某点周围遇到海洋点时,基于该海洋点再搜索周围的点,如果再找到则一直深究下去。

其Python代码如下:

class Solution:

def pondSizes(self, land: List[List[int]]) -> List[int]:

rows,cols = len(land),len(land[0])

if rows==0 or cols==0:

return []

def neighbor(i,j): # 用于遍历某点周围的所有点是否是海洋点

for nr,nc in [[i-1,j],[i+1,j],[i,j-1],[i,j+1],[i-1,j-1],[i-1,j+1],[i+1,j-1],[i+1,j+1]]:

if 0<=nr

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值