力扣面试题 16.19. 水域大小(java DFS解法)

Problem: 面试题 16.19. 水域大小

文章目录

  • 题目描述
  • 思路
  • 解题方法
  • 复杂度
  • Code

题目描述

在这里插入图片描述

思路

该问题可以归纳为一类遍历二维矩阵的题目,此类中的一部分题目可以利用DFS来解决,具体到本题目(该题目可以的写法大体不变可参看前面几个题目:):

Problem: 力扣面试题 08.10. 颜色填充(java DFS解法)
Problem: 力扣200. 岛屿数量(java DFS解法)
Problem: 力扣LCR 130. 衣橱整理(DFS 解法)

具体到本题目中:

我们只需要将记录方位的数组扩展成记录上、下、左、右、左上、右上、左下、右下即可,其余操作大体一致。

解题方法

1.定义并初始化给定矩阵的行,列(rows, cols),int类型变量count(记录连通水域的个数)定义用于存储数据的List集合result。遍历二维数组land若当前位置元素为0则调用编写的DFS函数,退出DFS后将当前连通位置的水域个数添加到result中,最后将将集合中元素拷贝到一个数组中排序并返回。
2. dfs函数实现

2.1 每次将当count加一,land当前位置置为1(标记当前位置是已经遍历过的合法位置)
2.2 二维数组记录八个方位int[][] directions = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}, {-1, -1}, {-1, 1}, {1, -1}, {1, 1}};
2.3 for循环开始查找遍历(循环范围1-8),每次得到一个新的坐标(int newI = sr + directions[i][0];int newJ = sc + directions[i][1];
2.4 条件判断新得到的横纵坐标不超过给定二维数组的索引范围,同时新的到的横纵坐标所在位置的值等于0则继续DFS

复杂度

时间复杂度:

O ( m n ) O(mn) O(mn)

空间复杂度:

O ( m n ) O(mn) O(mn)

Code

class Solution {//Recode the count of watersprivate int count = 0;//Recode the rows and columns of matrixprivate int rows;private int cols;/*** Get all Connected waters** @param land Given matrix* @return int[]*/public int[] pondSizes(int[][] land) {rows = land.length;cols = land[0].length;//Result listList<Integer> result = new ArrayList<>();for (int i = 0; i < rows; ++i) {for (int j = 0; j < cols; ++j) {if (land[i][j] == 0) {count = 0;dfs(i, j, land);result.add(count);}}}//Sortint[] finalResult = new int[result.size()];for (int i = 0; i < finalResult.length; ++i) {finalResult[i] = result.get(i);}Arrays.sort(finalResult);return finalResult;}/*** Access all connected waters by DFS** @param row  Abscissa* @param col  Ordinate* @param land Given matrix*/private void dfs(int row, int col, int[][] land) {count++;//Change the current position to 1//which shows that it has be visitedland[row][col] = 1;//Record eight bearingsint[][] directions = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}, {-1, -1}, {-1, 1}, {1, -1}, {1, 1}};for (int i = 0; i < 8; ++i) {int newI = row + directions[i][0];int newJ = col + directions[i][1];if (newI >= 0 && newI < rows && newJ >= 0 && newJ < cols&& land[newI][newJ] == 0) {dfs(newI, newJ, land);}}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/233888.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

华为实训课笔记 2023

华为实训 12/1312/1412/1812/19 12/13 ping 基于ICMP协议&#xff0c;用来进行可达性测试 ping 目的IP地址/设备域名&#xff08;主机名&#xff09; 如果能收到 reply 回复&#xff0c;则表示双方可以正常通信。一次正常的数据通信必须是有去有回。 <Huawei>用户视图&a…

几种常见开关电源电路图

用UC3842做的开关电源的典型电路见图1。过载和短路保护&#xff0c;一般是通过在开关管的源极串一个电阻&#xff08;R4&#xff09;&#xff0c;把电流信号送到3842的第3脚来实现保护。 当电源过载时&#xff0c;3842保护动作&#xff0c;使占空比减小&#xff0c;输出电压降…

旅游服务平台可视化大屏界面,UI设计PS资料

大屏通过实时的数据展示&#xff0c;可及时发现数据的变化和异常&#xff0c;以便及时采取措施。现分享蓝色简约大气旅游服务平台、蓝色渐变科技旅游服务平台可视化界面的Photoshop源文件&#xff0c;供UI设计师们快速获取PSD源文件完成工作。 若需更多 大屏组件&#xff0c;请…

在JavaScript中如何确保构造函数只被new调用

构造函数是一个特殊的函数&#xff0c;用于初始化一个新创建的对象。它是在创建对象时自动调用的。构造函数通常用于为对象的属性赋值&#xff0c;或者执行其他必要的设置。 使用函数名大写字母开头&#xff0c;这是一种命名约定&#xff0c;用于区分构造函数和普通函数。如何…

图纸加密软件哪个好用丨强烈推荐这个CAD图纸加密小技巧

只有身处设计行业的老板&#xff0c;也会设身处地的感受到&#xff0c;图纸加密软件的重要性&#xff01; 因为一个图纸可能就是一单生意&#xff0c;一单生意可能就能决定公司一年的营收。所以&#xff0c;选择适合企业饿图纸加密软件势在必行。 哪个图纸加密软件比较好用呢&…

下载svn client,小乌龟

给兄弟们提供一个下载svn client的软件连接 不好用包退货 https://sourceforge.net/projects/tortoisesvn/ 点击download即可

PyQt6 QFontDialog字体对话框控件

锋哥原创的PyQt6视频教程&#xff1a; 2024版 PyQt6 Python桌面开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili2024版 PyQt6 Python桌面开发 视频教程(无废话版) 玩命更新中~共计50条视频&#xff0c;包括&#xff1a;2024版 PyQt6 Python桌面开发 视频教程(无废话版…

Java 数据结构篇-实现堆的核心方法与堆的应用(实现 TOP-K 问题:最小 k 个数)

&#x1f525;博客主页&#xff1a; 【小扳_-CSDN博客】 ❤感谢大家点赞&#x1f44d;收藏⭐评论✍ 文章目录 1.0 堆的说明 2.0 堆的成员变量及其构造方法 3.0 实现堆的核心方法 3.1 实现堆的核心方法 - 获取堆顶元素 peek() 3.2 实现堆的核心方法 - 下潜 down(int i) 3.3 实…

嵌入式串口输入详细实例

学习目标 掌握串口初始化流程掌握串口输出单个字符掌握串口输出字符串掌握通过串口printf熟练掌握串口开发流程学习内容 需求 串口循环输出内容到PC机。 串口数据发送 添加Usart功能。 首先,选中Firmware,鼠标右键,点击Manage Project Items 接着,将gd32f4xx_usart.c添…

shell编程-重定向与打印命令详解(超详细)

文章目录 前言一、Shell重定向1. 标准输入重定向2. 标准输出重定向3. 追加重定向4. 标准错误重定向5. 合并输出和错误重定向6. /dev/null文件 二、Shell中的echo命令与printf命令1. echo命令1.1 命令格式1.2 功能描述1.3 常用选项1.4 示例 2. printf命令2.1 命令格式2.2 功能描…

xcode无线真机调试详细图文步骤

步骤一、 步骤二&#xff1a; 步骤三&#xff1a; 配置完到这里&#xff0c;点击真机右键&#xff0c;菜单栏并未出现connect via ip address 选项&#xff0c;也没出现无线连接的小地球图标&#xff0c;别慌&#xff0c;接着进行下一步操作即可。 步骤四&#xff1a; 1.打开…

什么是同源策略?

同源 同源指的是URL有相同的协议、主机名和端口号。 同源策略 同源策略指的是浏览器提供的安全功能&#xff0c;非同源的RUL之间不能进行资源交互 跨域 两个非同源之间要进行资源交互就是跨域。 浏览器对跨域请求的拦截 浏览器是允许跨域请求的&#xff0c;但是请求返回…

Ceph入门到精通-smartctl 查看硬盘参数

smartctl 参数含义 Model Family: Toshiba s... Enterprise Capacity HDD Device Model: TOSHIBA MG08ACss Serial Number: sssssss LU WWN Device Id: 5 ss ss Firmware Version: 4303 User Capacity: 16,000,900,661,248 bytes [16.0 TB] Sector Sizes: 51…

手机端升级ChatGPT失败怎么办?解决方案

昨天一个朋友说他手机端升级失败如下图 其实手机端对IP环境要求更严格&#xff0c;升级失败很正常&#xff0c;解决办法就是使用电脑端就可以了&#xff0c;电脑端对IP环境相对来说没有手机那么严格 不管手机电脑&#xff0c;都要用最纯净的IP才行&#xff0c;如果不行&#xf…

【递归 回溯】LeetCode-22. 括号生成

22. 括号生成。 数字 n 代表生成括号的对数&#xff0c;请你设计一个函数&#xff0c;用于能够生成所有可能的并且 有效的 括号组合。 示例 1&#xff1a; 输入&#xff1a;n 3 输出&#xff1a;["((()))","(()())","(())()","()(())&q…

MyBatis——MyBatis的CRUD(增删改查)

1.MyBatis的CRUD 创建工程&#xff1a; 1.1.查询 1.1.1.单个参数绑定 //单个参数传递public User findUserById(Integer id);<!--parameterType:指定输入参数的类型resultType&#xff1a;指定数据结果封装的数据类型#{id}&#xff1a;它代表占位符&#xff0c;相当于原来…

Linux中systemctl使用

第一&#xff1a;创建Service文件 要创建一个Systemd服务&#xff0c;您需要遵循以下步骤&#xff1a; 使用文本编辑器创建一个新的Service文件&#xff0c;例如my_service.service。 sudo vim /etc/systemd/system/my_service.service在打开的文件中&#xff0c;添加以下内容&…

大数据讲课笔记5.1 初探MapReduce

文章目录 零、学习目标一、导入新课二、新课讲解&#xff08;一&#xff09;MapReduce核心思想&#xff08;二&#xff09;MapReduce编程模型&#xff08;三&#xff09;MapReduce编程实例——词频统计思路1、Map阶段&#xff08;映射阶段&#xff09;2、Reduce阶段&#xff08…

【Java异常】idea 报错:无效的目标发行版:17 的解决办法

【Java异常】idea 报错&#xff1a;无效的目标发行版&#xff1a;17 的解决办法 一&#xff0c;问题来源 springcloud的第一个demo项目就给我干趴了 二、原因分析 java: 无效的目标发行版: 17 原因就是 JDK 版本不对。从 IDEA 编辑器中可以找到问题的原因所在&#xff0c;…