你有一个用于表示一片土地的整数矩阵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<rows and 0<=nc<cols and land[nr][nc]==0:yield nr,ncmax_num = []    # 用于存储所有池塘的面积queue = collections.deque()   # 队列,用于广度优先遍历for i in range(rows):    #  遍历整个地图for j in range(cols):if land[i][j] == 0:    # 发现海洋点queue.append([i,j])    # 将当前海洋位置放进队列中land[i][j] = -1    # 将当前海洋的数据从0变为-1,表示已经搜索过num = 1    # 当前海洋面积的大小为1while queue:    # 遍历当前海洋的周围所有邻居的情况nr,nc = queue.popleft()    for ii,jj in neighbor(nr,nc):    #  使用上面定义的生成器函数    land[ii][jj] = -1    # 找到l周围的海洋,并将其值变为-1,表示已经搜索过queue.append([ii,jj])    # 将其放进队列中,用于下一步的广度优先遍历num += 1    # 当其周围有一个海洋时,池塘的面积需要加1max_num.append(num)      # 将当前位置的池塘面积大小放进队列中      return sorted(max_num)

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<rows and 0<=nc<cols and land[nr][nc]==0:yield nr,ncdef dfs(i,j):    # 深度遍历函数area = 1land[i][j] = 1    # 修改已经遍历过的海洋点for nr,nc in neighbor(i,j):    # 对land[i][j]的周围进行遍历,找到海洋点area += dfs(nr,nc)    return areamax_num = []    # 用于存储不同的池塘面积for i in range(rows):    # 遍历整个地图for j in range(cols):if land[i][j] == 0:    # 遇到海洋点max_num.append(dfs(i,j))    # dfs()函数返回以包括land[i][j]的池塘面积return sorted(max_num)    # 进行排序

leetcode —— 面试题 16.19. 水域大小相关推荐

  1. LeetCode——面试题 16.19. 水域大小

    水域大小 题目 深搜思路 代码 结果 广搜思路 代码 结果 题目 你有一个用于表示一片土地的整数矩阵land,该矩阵中每个点的值代表对应地点的海拔高度.若值为0则表示水域.由垂直.水平或对角连接的水域 ...

  2. leetcode面试题 16.19. 水域大小(深度优先搜索)

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

  3. Leetcode每日一题:面试题16.19.水域大小

    简单的DFS //八个方位 const int dx[8] = {1, -1, 0, 0, -1, -1, 1, 1}; const int dy[8] = {0, 0, 1, -1, -1, 1, ...

  4. 面试题 16.19.水域大小

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

  5. 程序员面试金典 - 面试题 16.19. 水域大小(BFS/DFS)

    1. 题目 你有一个用于表示一片土地的整数矩阵 land,该矩阵中每个点的值代表对应地点的海拔高度. 若值为0则表示水域.由垂直.水平或对角连接的水域为池塘. 池塘的大小是指相连接的水域的个数. 编写 ...

  6. leetcode面试题 16.26. 计算器(栈)

    给定一个包含正整数.加(+).减(-).乘(*).除(/)的算数表达式(括号除外),计算其结果. 表达式仅包含非负整数,+, - ,*,/ 四种运算符和空格 . 整数除法仅保留整数部分. 示例 1: ...

  7. leetcode面试题 16.21. 交换和(二分查找)

    给定两个整数数组,请交换一对数值(每个数组中取一个数值),使得两个数组所有元素的和相等. 返回一个数组,第一个元素是第一个数组中要交换的元素,第二个元素是第二个数组中要交换的元素.若有多个答案,返回任 ...

  8. leetcode面试题 16.04. 井字游戏

    设计一个算法,判断玩家是否赢了井字游戏.输入是一个 N x N 的数组棋盘,由字符" ","X"和"O"组成,其中字符" &quo ...

  9. 水域大小/岛屿最大面积-dfs

    695.岛屿的最大面积 面试题 16.19. 水域大小 基本的dfs模板如下: for (int i = 0; i < grid.length; i++) {for (int i1 = 0; i ...

最新文章

  1. 强大自己,从学习开始!2020年最有内容的订阅号,每一个都是万里挑一!
  2. 帝国cms7.5百度小程序针对搜索引擎自然搜索优化版生成静态版
  3. 【Ogre-windows】实例配置
  4. IHttpHandler与IHttpHandlerFactory的区别一例
  5. 全面认识UML类图元素
  6. 传输分析_密西根大学倪军谈信息传输与分析成本:5G的推广让该问题不复存在...
  7. Http和RPC区别
  8. 电路邱关源第五版部分章节总结笔记
  9. Netron - 网络可视化
  10. 人工智能AI系列 - 元宇宙 - 2D虚拟人
  11. 5.3输入两个正整数m和n,求其最大公约数和最小公倍数。
  12. /usr/local/bin/zsh没有文件或目录问题
  13. HL340(usb转串口线)驱动
  14. Win10安装Deepin双系统找不到启动项
  15. android web 爬虫,Android学习——Jsoup实现网络爬虫,爬取贤集网
  16. the page has expired due to inactivity. please refresh and try again
  17. F014-正本清源话通缩 #F1175
  18. 编程新技术实务实验二
  19. 知识分享:电脑可以使用的pdf翻译软件哪个好用?
  20. 转:动态规划题目分类

热门文章

  1. 继承ListPreference后,去掉右边的图标
  2. 初识 npm script : 用 npm init 快速创建项目
  3. JavaScript 内存机制(前端同学进阶必备)
  4. 面试官系统精讲Java源码及大厂真题 - 46 ServerSocket 源码及面试题
  5. ZooKeeper--分层仲裁简介
  6. C#以对象为成员的例子
  7. JDK1.8 中 ConcurrentHashMap源码分析(一)容器初始化
  8. js实现点击按钮复制文本功能
  9. “mysql数据库表锁死,既打不开,也关不上”的解决方案
  10. python的内建函数built-in functions