面试题 16.19. 水域大小

程序员面试金典 – 面试题 16.19. 水域大小(BFS/DFS) 1. 题目 你有一个用于表示一片土地的整数矩阵 land,该矩阵中每个点的值代表对应地点的海拔高度。 若值为0则表示水域。由垂直、水平或对角连接的水域为池塘。 池塘的大小是指相连接的水域的个数。 编写一个方法来计算矩阵中所有池塘的大小,返回值需要从小到大排序。 示例: 输入: [ [0,2,1,0], [0,1,0,1], [1,1,0,1], [0,1,0,1] ] 输出: [1,2,4] 提示: 0 < len(land) <= 1000 0 < len(land[i]) <= 1000 来源:力扣(LeetCode) 链接:https://leetcode-cn.com 立即下载

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

示例:

输入:
[
  [0,2,1,0],
  [0,1,0,1],
  [1,1,0,1],
  [0,1,0,1]
]
输出: [1,2,4]

提示:

  • 0 < len(land) <= 1000
  • 0 < len(land[i]) <= 1000

在这篇博客中,我们将讨论 LeetCode 上的面试题 16.19 水域大小。我们将介绍问题的背景,给出问题的详细描述,并提供两种解决方案,分别使用 C++ 和 Java 编程语言实现。最后,我们会对解决方案进行详细的解释,并给出完整的代码。

问题背景

给定一个整数矩阵 land,其中每个点的值代表对应地点的海拔高度。矩阵中的值为 0 表示水域,而由垂直、水平或对角连接的水域构成了池塘。池塘的大小表示相连接的水域的个数。我们需要编写一个方法来计算矩阵中所有池塘的大小,并按从小到大的顺序返回结果。

问题描述

我们需要实现一个函数 pondSizes,接收一个整数矩阵 land,并返回一个整数数组,其中按从小到大的顺序存储了所有池塘的大小。

函数签名如下:

vector<int> pondSizes(vector<vector<int>>& land);
public int[] pondSizes(int[][] land);

博客:面试题 16.19 水域大小 - 寻找池塘并排序

在这篇博客中,我们将讨论 LeetCode 上的面试题 16.19 水域大小。我们将介绍问题的背景,给出问题的详细描述,并提供两种解决方案,分别使用 C++ 和 Java 编程语言实现。最后,我们会对解决方案进行详细的解释,并给出完整的代码。

问题背景

给定一个整数矩阵 land,其中每个点的值代表对应地点的海拔高度。矩阵中的值为 0 表示水域,而由垂直、水平或对角连接的水域构成了池塘。池塘的大小表示相连接的水域的个数。我们需要编写一个方法来计算矩阵中所有池塘的大小,并按从小到大的顺序返回结果。

问题描述

我们需要实现一个函数 pondSizes,接收一个整数矩阵 land,并返回一个整数数组,其中按从小到大的顺序存储了所有池塘的大小。

函数签名如下:


cppCopy code

vector<int> pondSizes(vector<vector<int>>& land);


javaCopy code

public int[] pondSizes(int[][] land);

解决方案

我们将提供两种解决方案,分别使用深度优先搜索(DFS)和广度优先搜索(BFS)。

解法一:深度优先搜索(DFS)

在这种解决方案中,我们将使用递归的深度优先搜索来找到每个池塘的大小。我们遍历整个矩阵,对于每个为 0 的点(水域),我们调用 dfs 函数来计算该点所在池塘的大小。在 dfs 函数中,我们首先检查当前点是否越界或者不是水域(即非 0 值)。如果是,我们返回 0。否则,我们将当前点的值设为 -1,以标记该点已经被访问过。然后,我们递归地调用 dfs 函数来遍历当前点的相邻点,计算池塘的大小。最后,我们返回计算得到的池塘大小。

具体的 C++ 代码如下:

class Solution {
public:
    vector<int> pondSizes(vector<vector<int>>& land) {
        int m = land.size();
        int n = land[0].size();
        vector<int> res;
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                if (land[i][j] == 0) {
                    res.push_back(dfs(land, i, j));
                }
            }
        }
        sort(res.begin(), res.end());
        return res;
    }

    int dfs(vector<vector<int>>& land, int x, int y) {
        int m = land.size();
        int n = land[0].size();
        if (x < 0 || x >= m || y < 0 || y >= n || land[x][y] != 0) {
            return 0;
        }
        land[x][y] = -1;
        int res = 1;
        for (int dx = -1; dx <= 1; dx++) {
            for (int dy = -1; dy <= 1; dy++) {
                if (dx == 0 && dy == 0) {
                    continue;
                }
                res += dfs(land, dx + x, dy + y);
            }
        }
        return res;
    }
};

具体的 Java 代码如下:

class Solution {
    public int[] pondSizes(int[][] land) {
        int m = land.length;
        int n = land[0].length;
        List<Integer> resList = new ArrayList<>();
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                if (land[i][j] == 0) {
                    resList.add(dfs(land, i, j));
                }
            }
        }
        int[] res = new int[resList.size()];
        for (int i = 0; i < resList.size(); i++) {
            res[i] = resList.get(i);
        }
        Arrays.sort(res);
        return res;
    }

    public int dfs(int[][] land, int x, int y) {
        int m = land.length;
        int n = land[0].length;
        if (x < 0 || x >= m || y < 0 || y >= n || land[x][y] != 0) {
            return 0;
        }
        land[x][y] = -1;
        int res = 1;
        for (int dx = -1; dx <= 1; dx++) {
            for (int dy = -1; dy <= 1; dy++) {
                if (dx == 0 && dy == 0) {
                    continue;
                }
                res += dfs(land, dx + x, dy + y);
            }
        }
        return res;
    }
}

解法二:广度优先搜索(BFS)

在这种解决方案中,我们将使用广度优先搜索来找到每个池塘的大小。我们遍历整个矩阵,对于每个为 0 的点(水域),我们调用 bfs 函数来计算该点所在池塘的大小。在 bfs 函数中,我们使用一个队列来存储待访问的水域点。开始时,我们将当前点加入队列,并将其值设为 -1,以标记该点已经被访问过。然后,我们进入循环,不断从队列中取出点,计算池塘的大小。对于每个取出的点,我们遍历其相邻的点,将所有为 0 的相邻点加入队列,并将其值设为 -1。最后,我们返回计算得到的池塘大小。

具体的 Java 代码如下:

class Solution {
    public int[] pondSizes(int[][] land) {
        int m = land.length;
        int n = land[0].length;
        List<Integer> resList = new ArrayList<>();
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                if (land[i][j] == 0) {
                    resList.add(bfs(land, i, j));
                }
            }
        }
        int[] res = new int[resList.size()];
        for (int i = 0; i < resList.size(); i++) {
            res[i] = resList.get(i);
        }
        Arrays.sort(res);
        return res;
    }

    public int bfs(int[][] land, int x, int y) {
        int m = land.length;
        int n = land[0].length;
        int res = 0;
        Queue<int[]> queue = new ArrayDeque<int[]>();
        queue.add(new int[]{x, y});
        land[x][y] = -1;
        while (!queue.isEmpty()) {
            int[] arr = queue.poll();
            int currX = arr[0], currY = arr[1];
            res++;
            for (int dx = -1; dx <= 1; dx++) {
                for (int dy = -1; dy <= 1; dy++) {
                    if (dx == 0 && dy == 0) {
                        continue;
                    }
                    if (currX + dx < 0 || currX + dx >= m || currY + dy < 0 || currY + dy >= n || land[currX + dx][currY + dy] != 0) {
                        continue;
                    }
                    land[currX + dx][currY + dy] = -1;
                    queue.add(new int[]{currX + dx, currY + dy});
                }
            }
        }
        return res;
    }
}

总结

本篇博客我们讨论了 LeetCode 上的面试题 16.19 水域大小。我们介绍了问题的背景和详细描述,并给出了两种解决方案,分别使用深度优先搜索(DFS)和广度优先搜索(BFS)。我们给出了具体的代码实现,并对解决方案进行了详细的解释。希望这篇博客对你理解和解决这道问题有所帮助。

Windows下Anaconda换清华镜像源最全指南(含常见问题解决) 本文提供了一份详尽的Windows系统下Anaconda配置清华镜像源的完整指南。针对网络下载缓慢的痛点,文章详细对比了命令行添加与直接编辑配置文件两种主流方法,并重点解决了配置过程中常见的文件缺失、安装失败、环境求解缓慢等疑难问题,帮助用户一劳永逸地提升包管理效率。 阅读详情

相关推荐

无线图像传输新突破:深度JSCC算法在低带宽环境下的性能实测

本文深入探讨了基于深度学习的信源信道联合编码(JSCC)算法在低带宽无线图像传输中的突破性表现。通过实测数据对比,深度JSCC在低信噪比环境下展现出卓越的鲁棒性,有效对抗传统方案的“悬崖效应”,实现图像质量的平滑下降,为远程医疗、工业巡检等严苛场景提供了新的解决方案。

weixin_29090089的博客 504

面试题 16.19 水域大小(dfs)

1. 问题描述: 你有一个用于表示一片土地的整数矩阵land,该矩阵中每个点的值代表对应地点的海拔高度。若值为0则表示水域。由垂直、水平或对角连接的水域为池塘。池塘的大小是指相连接的水域的个数。编写一个方法来计算矩阵中所有池塘的大小,返回值需要从小到大排序。 示例: 输入: [ [0,2,1,0], [0,1,0,1], [1,1,0,1], [0,1,0,1] ] 输出: [1,2,4] 提示: 0 < len(land) <= 1000 0 < len(la...

二哈 923

EPLAN电气设计精华 -模拟量传感器画法全解

本文介绍了EPLAN中模拟量压力传感器的标准画法要点,重点解析了电流型(4-20mA)、电压型(0-10V/0-5V)和特定应用型三种传感器的核心特点、典型符号、接线方式及应用场景。文章提供了EPLAN设备标识符示例,并分享了一个实际项目案例(XJC-Y01-20-4M传感器配合XJC-608T-F变送器和GSEE.GXLK-AI4S-I模块的应用),强调绘制前查阅技术资料的重要性。内容简明实用,有助于规范电气设计中的传感器绘制。

Qinmingyue13的博客 1180

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

1.深搜 2.广搜

weixin_44750790的博客 1349

浪涌电流测试仪的工作原理

浪涌电流脉冲形成的开始由同步电路 13 确定,该同步电路 13 发送命令以打开和第二开关 10 和 11,向发生器 14 发送控制命令以生成被测半导体器件 5 的控制信号和参考信号整形器 9 的触发脉冲。电流源的功率输出并联连接,以对流经被测半导体样品的电流求和。此外,使用数字控制扩展了测试仪的功能,能够产生各种形状的电流脉冲,例如梯形电流脉冲,以估计被测晶闸管的导通状态扩展时间。由于晶体管3的栅极是连接的,并且平衡电阻4包含在晶体管3的源中,因此通过每个晶体管3的电流脉冲大致相同,并重复参考信号的形状。

Jesse0257的博客 1255

SAP PPDS启发式排产实战:从零配置到自定义规则开发(附ABAP代码示例)

本文详细介绍了SAP PPDS启发式排产的实战应用,从基础配置到自定义规则开发的全流程。通过ABAP代码示例,展示了如何实现多目标优化、实时响应和约束可视化,帮助企业提升订单交付率、减少设备闲置时间。文章还包含开发环境准备、标准模板解析、自定义开发步骤及性能优化技巧,适合制造业数字化转型的实践参考。

seed的博客 183

【每日一题Day245】面试题 16.19. 水域大小 | dfs

【每日一题Day245】面试题 16.19. 水域大小 | dfs

Tikitian的博客 347

vasp-自旋轨道耦合(SOC)计算步骤

在VASP中执行自旋轨道耦合(SOC)计算,具体的计算步骤如下: 结构优化获取CONTCAR文件 自洽计算(collinear normal VASP calculations)获取IBZKPT,CHGCAR和WAVECAR文件。 SCF+SOC计算,在此步骤中,将步骤2中的IBZKPT复制为KPOINTS,以便两个步骤具有相同的k网格,因此可以读取步骤2中的CHGCAR和WAVECAR文件。 能带结构计算,在此步骤中,将KPOINTS改为高对称点,读取步骤3中的CHGCAR和WAVECAR文件。

懒散的鱼与消失的猫 3万+

LeetCode-面试题 16.19. 水域大小-深度优先搜索

/** 面试题 16.19. 水域大小 * @author 作者 Your-Name: * @version 创建时间:2020年3月3日 上午10:27:57 * 你有一个用于表示一片土地的整数矩阵land,该矩阵中每个点的值代表对应地点的海拔高度。若值为0则表示水域。由垂直、水平或对角连接的水域为池塘。池塘的大小是指相连接的水域的个数。编写一个方法来计算矩阵中所有池塘的大小,返回值需要从...

l769440473的博客 7269

CTF---Web---文件包含---01

文章目录前言一、题目描述二、解题步骤1.查看源代码2.文件包含(/etc/passwd)3.解码总结 前言 题目分类: CTF—Web—文件包含 一、题目描述 题目:提示寻找passwd文件 二、解题步骤 1.查看源代码 提示所有图片存储路径是download.php?name=img, 此时name参数的存在就提示此题可能为“文件包含”。 2.文件包含(/etc/passwd) 两种查看方式: 2.1、访问view-source:http://192.168.87.180/download.php

qq_22160557的博客 1391

FPGA实现DDR接口

verilog// DDR2控制器状态机// 初始化序列// 发出初始化命令endendendend// 自动预充电end// 其他状态...endcaseendend。

whm128的博客 998

力扣 面试题 16.19.水域大小

摘要:本文介绍了一种计算矩阵中所有池塘大小并按升序排序的方法。给定一个表示土地海拔的矩阵,其中0代表水域,相连的水域构成池塘。通过深度优先搜索(DFS)算法遍历每个水域点,统计相连接的池塘面积。使用8方向增量数组处理垂直、水平和对角连接,并用访问矩阵标记已计算水域。最后将所有池塘面积排序输出。与LeetCode 695题类似,但需记录所有水域面积而非仅最大值。代码实现包括DFS递归搜索和主函数处理输入输出。

odd_hum的博客 244

别再只当调包侠了!YOLO检测头到损失函数全链路拆解,看完才算真懂

YOLO的精妙不在于某个单一创新,而在于各模块围绕“实时精准检测”这一目标的协同设计。Backbone追求高效特征压缩,Neck保障多尺度信息流通,Head解耦任务冲突,Loss动态引导优化方向。只有理解这套内在逻辑,才能跳出“调包-试错”的低效循环,在面对新场景、新问题时做出有理有据的改进决策。技术深度决定职业天花板。下次再调YOLO时,不妨先问自己:我改的这个参数,到底影响了系统中的哪一环?参考资料。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 185

LeetCode面试题 16.19. 水域大小

面试题 16.19. 水域大小 难度中等25收藏分享切换为英文关注反馈 你有一个用于表示一片土地的整数矩阵land,该矩阵中每个点的值代表对应地点的海拔高度。若值为0则表示水域。由垂直、水平或对角连接的水域为池塘。池塘的大小是指相连接的水域的个数。编写一个方法来计算矩阵中所有池塘的大小,返回值需要从小到大排序。 示例: 输入: [ [0,2,1,0], [0,1,0,1], [1,1,0,1], [0,1,0,1] ] 输出: [1,2,4] 提示: 0 < len(l

Sgappti的博客 1448

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

LeetCode面试题 16.19 水域大小

LeetCode面试题 16.19 水域大小

流水账 333

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

LeetCode:面试题 16.19. 水域大小

1、2021/1/16 面试题 16.19. 水域大小 难度中等40 你有一个用于表示一片土地的整数矩阵land,该矩阵中每个点的值代表对应地点的海拔高度。若值为0则表示水域。由垂直、水平或对角连接的水域为池塘。池塘的大小是指相连接的水域的个数。编写一个方法来计算矩阵中所有池塘的大小,返回值需要从小到大排序。 示例: 输入: [ [0,2,1,0], [0,1,0,1], [1,1,0,1], [0,1,0,1] ] 输出: [1,2,4] 提示: 0 < len(land) &

qq_42847094的博客 267

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

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

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

然后就去远行 6258

水域大小 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)链接:http...

weixin_36422707的博客 463

leetcode 面试题 16.19. 水域大小

你有一个用于表示一片土地的整数矩阵land,该矩阵中每个点的值代表对应地点的海拔高度。若值为0则表示水域。由垂直、水平或对角连接的水域为池塘。池塘的大小是指相连接的水域的个数。编写一个方法来计算矩阵中所有池塘的大小,返回值需要从小到大排序。 示例: 输入: [ [0,2,1,0], [0,1,0,1], [1,1,0,1], [0,1,0,1] ] 输出: [1,2,4] 提示: 0 < len(land) <= 1000 0 < len(land[i]) <= 1000 通过次数9

xunzhaofupo的博客 852

LeetCode-面试题 16.19. 水域大小

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

保持对编程的热情! 3987

面试题 16.19.水域大小

题目很正常,思路也简单。 思路:每个点都要循环一遍。如果是0,递归且把走过的路径置为1。 当时有个坑,是不知道计数要怎么计数。 当时在dfs()函数最后一行写到

k的博客 2624

LeetCode 面试题 16.19. 水域大小

来源:力扣(LeetCode)链接:https://leetcode.cn/problems/group-anagrams/description/

Rp的博客 992
上一篇: ip数据报计算首部检验和
下一篇: 使用std::clamp函数判断圆和矩形是否重叠
天皓Oo
博客等级 码龄5年 337粉丝 61原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值