104. 建造最大岛屿

题目描述:给定一个由 1(陆地)和 0(水)组成的矩阵,你最多可以将矩阵中的一格水变为一块陆地,在执行了此操作之后,矩阵中最大的岛屿面积是多少。岛屿面积的计算方式为组成岛屿的陆地的总数。岛屿是被水包围,并且通过水平方向或垂直方向上相邻的陆地连接而成的。你可以假设矩阵外均被水包围。
输入描述:第一行包含两个整数 N, M,表示矩阵的行数和列数。之后 N 行,每行包含 M 个数字,数字为 1 或者 0,表示岛屿的单元格。
输出描述:输出一个整数,表示最大的岛屿面积。如果矩阵中不存在岛屿,则输出 0。

本题有一种暴力解法,遍历地图尝试 将每一个 0 改成1,然后去搜索地图中的最大的岛屿面积,但时间复杂度太高,因为重复遍历了原本存在的岛屿。只要用一次深搜把每个岛屿的面积记录下来就好。
第一步:一次遍历地图,得出各个岛屿的面积,并做编号记录。可以使用map记录,key为岛屿编号,value为岛屿面积
第二步:再遍历地图,遍历0的方格(因为要将0变成1),并统计该1(由0变成的1)周边岛屿面积,将其相邻面积相加在一起,遍历所有 0 之后,就可以得出 选一个0变成1 之后的最大面积。

代码如下:

#include <iostream>
#include <vector>
#include <unordered_set>
#include <unordered_map>
using namespace std;
int n, m;
int count;int dir[4][2] = {0, 1, 1, 0, -1, 0, 0, -1}; // 四个方向
void dfs(vector<vector<int>>& grid, vector<vector<bool>>& visited, int x, int y, int mark) {if (visited[x][y] || grid[x][y] == 0) return; // 终止条件:访问过的节点 或者 遇到海水visited[x][y] = true; // 标记访问过grid[x][y] = mark; // 给陆地标记新标签count++;for (int i = 0; i < 4; i++) {int nextx = x + dir[i][0];int nexty = y + dir[i][1];if (nextx < 0 || nextx >= n || nexty < 0 || nexty >= m) continue;  // 越界了,直接跳过dfs(grid, visited, nextx, nexty, mark);}
}int main() {cin >> n >> m;vector<vector<int>> grid(n, vector<int>(m, 0));for (int i = 0; i < n; i++) {for (int j = 0; j < m; j++) {cin >> grid[i][j];}}vector<vector<bool>> visited(n, vector<bool>(m, false)); // 标记访问过的点unordered_map<int ,int> gridNum;int mark = 2; // 记录每个岛屿的编号bool isAllGrid = true; // 标记是否整个地图都是陆地for (int i = 0; i < n; i++) {for (int j = 0; j < m; j++) {if (grid[i][j] == 0) isAllGrid = false;if (!visited[i][j] && grid[i][j] == 1) {count = 0;dfs(grid, visited, i, j, mark); // 将与其链接的陆地都标记上 truegridNum[mark] = count; // 记录每一个岛屿的面积mark++; // 记录下一个岛屿编号}}}if (isAllGrid) {cout << n * m << endl; // 如果都是陆地,返回全面积return 0; // 结束程序}// 以下逻辑是根据添加陆地的位置,计算周边岛屿面积之和int result = 0; // 记录最后结果unordered_set<int> visitedGrid; // 标记访问过的岛屿for (int i = 0; i < n; i++) {for (int j = 0; j < m; j++) {count = 1; // 记录连接之后的岛屿数量visitedGrid.clear(); // 每次使用时,清空if (grid[i][j] == 0) {for (int k = 0; k < 4; k++) {int neari = i + dir[k][1]; // 计算相邻坐标int nearj = j + dir[k][0];if (neari < 0 || neari >= n || nearj < 0 || nearj >= m) continue;if (visitedGrid.count(grid[neari][nearj])) continue; // 添加过的岛屿不要重复添加// 把相邻四面的岛屿数量加起来count += gridNum[grid[neari][nearj]];visitedGrid.insert(grid[neari][nearj]); // 标记该岛屿已经添加过}}result = max(result, count);}}cout << result << endl;}

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

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

相关文章

安卓自动化的一些API

def run_adb_command():pass创建指定大小的文件 def create_random_file(file_path: str, file_size: int 1024):# 1M 1024 * 1024if file_path.endswith("/"):raise Exception(f"请输入正确的文件路径:{file_path}")file_name file_path.rsplit("…

安装Yarn的方法

安装Yarn的方法取决于你的操作系统。以下是几种常见操作系统上安装Yarn的步骤&#xff1a; Windows 使用Yarn的MSI安装程序 访问Yarn的官方网站&#xff08;https://yarnpkg.com/getting-started/install&#xff09;&#xff0c;下载最新版本的Yarn安装程序&#xff08;通常是…

shark云原生-日志体系-ECK

文章目录 0. ECK 介绍1. 部署 CRDS & Opereator2. 部署 Elasticsearch 集群3. 配置存储4. 部署示例 0. ECK 介绍 ECK&#xff08;Elastic Cloud on Kubernetes&#xff09;是Elasticsearch官方提供的一种方式&#xff0c;用于在Kubernetes上部署、管理和扩展Elasticsearch…

桥接(Bridge)

桥接&#xff08;Bridge&#xff09; 桥接&#xff08;Bridge&#xff09;__bridge__bridge_transfer__bridge_retained 桥接&#xff08;Bridge&#xff09; 在开发 iOS 应用程序时我们有时会用到 Core Foundation 对象&#xff08;简称 CF&#xff09;&#xff0c;例如 Core…

python 循环计算阶乘函数

应用场景&#xff1a; 1. 数学计算和问题求解&#xff0c;例如组合数学、概率统计等领域中&#xff0c;经常需要计算阶乘。 2. 算法设计中&#xff0c;某些算法可能需要用到阶乘来计算排列组合的数量或进行特定的数学运算。 3. 计算特定问题的解&#xff0c;如计算 n 个元素的全…

Redis这样优化后,又能“抗住”更大的并发了

插&#xff1a; AI时代&#xff0c;程序员或多或少要了解些人工智能&#xff0c;前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家(前言 – 人工智能教程 ) 坚持不懈&#xff0c;越努力越幸运&#xff0c;大家…

在Ubuntu上安装VNC服务器教程

Ubuntu上安装VNC服务器方法&#xff1a;按照root安装TeactVnc&#xff0c;随后运行vncserver输入密码&#xff0c;安装并打开RickVNC客户端&#xff0c;输入服务器的IP&#xff0c;最后连接输入密码即可。 VNC或虚拟网络计算&#xff0c;可让您连接到远程Linux / Unix服务器的…

百数教学:如何用分析图表助力报表可视化?

表单收集的数据是决策的重要依据&#xff0c;而报表则是分析和处理这些数据的关键工具。 通过报表&#xff0c;我们能够进行明细查询&#xff0c;深入了解每一条数据的细节&#xff1b;通过汇总功能&#xff0c;用户能够快速掌握整体情况&#xff1b;计算平均值有助于用户评估…

为何Web前端开发仍坚守 HTML 和 CSS,而不全然拥抱纯 JavaScript?

在Web开发的世界里&#xff0c;HTML、CSS 和 JavaScript 三者构成了前端开发的基石。尽管 JavaScript 以其强大的功能和灵活性赢得了开发者们的青睐&#xff0c;甚至有人提出是否可以完全使用 JavaScript 来取代 HTML 和 CSS&#xff0c;实现“纯 JavaScript 开发”。然而&…

《nginx应用》-- nginx简单部署vue项目

一、vue项目的打包 vue项目在本地调试完成后&#xff0c;即可执行以下命令打包部署&#xff0c;此时会生成一个 dist 包&#xff0c;这个包即是我们要部署的文件。 npm run build 二、nginx 的安装 nginx 的安装比较简单&#xff0c;直接用 yum 安装即可 yum install nginx…

SCT612404通道,高效高集成,摄像头模组电源集成芯片

集成三路降压变换器&#xff0c;1CH高压BUCK,2CH低压Buck >HVBuck1:输入电压4.0V-20V,输出电流1.2A,Voo300mV/500mV >LVBuck2:输入电压2.7V-5V,输出电流0.6A , 固定1.8V输出 ;LVBuck3:输λ2.7V-5V,输出电流1.2A,可设定固定输出&#xff1a; 1 . 1 V / 1 . 2 V / 1 . 3 …

for nested data item, row-key is required.报错解决

今天差点被一个不起眼的bug搞到吐&#xff0c;就是在给表格设置row-key的时候&#xff0c;一直设置不成功&#xff0c;一直报错缺少row-key&#xff0c;一共就那两行代码 实在是找不到还存在什么问题... 先看下报错截图... 看下代码 我在展开行里面用到了一个表格 并且存放表格…

公共事件应急日常管理系统-计算机毕业设计源码40054

公共事件应急日常管理系统的设计与实现 摘 要 本研究基于Spring Boot框架&#xff0c;设计并实现了公共事件应急日常管理系统&#xff0c;旨在提升公共事件的应急响应和日常管理效率。系统包括应急资源管理、物资申请管理、物资发放管理、应急培训管理、科普宣教管理、公共事件…

html5中的iframe

HTML5中的iframe 浏览上下文是浏览器展示文档的环境&#xff0c;通常是一个tab标签页&#xff0c;一个窗体或者是浏览器页面的一部分。每个浏览上下文都有一个活动文档的源和一个记录所有展示文档的有序历史。浏览上下文的通讯被严格限制&#xff0c;只有两个同源的浏览器上下…

浔川为何做起音乐、电影报?——浔川官方回应

官方回应 满足群众对音乐和电影文化的需求&#xff1a;为读者提供音乐和电影方面的资讯、评论、介绍等&#xff0c;丰富人们的文化生活。 推动当地音乐和电影产业的发展&#xff1a;通过报道本地的音乐、电影活动等&#xff0c;为提供宣传和推广的平台&#xff0c;促进其繁荣。…

数据中心代理IP与普通代理IP有何区别?

数据中心代理IP与普通代理IP在使用方式和性质上存在一些区别。以下是两者之间的主要区别&#xff1a; 1.来源不同&#xff1a;数据中心代理IP是由数据中心提供的&#xff0c;这些数据中心通常专门提供IP代理服务&#xff0c;并且拥有大量的服务器和IP地址。而普通代理IP则来自…

Redis 多数据源 Spring Boot 实现

1.前言 本文为大家提供一个 redis 配置多数据源的实现方案&#xff0c;在实际项目中遇到&#xff0c;分享给大家。后续如果有时间会写一个升级版本&#xff0c;升级方向在第5点。 2.git 示例地址 git 仓库地址&#xff1a;https://github.com/huajiexiewenfeng/redis-multi-…

剖析DeFi交易产品之UniswapV3:Pool合约

本文首发于公众号&#xff1a;Keegan小钢 UniswapV3Pool 合约则复杂很多了&#xff0c;其引用的库合约就达到了 13 个&#xff0c;通过 using 方式使用的也达到了 9 个&#xff0c;如下所示&#xff1a; using LowGasSafeMath for uint256; using LowGasSafeMath for int256; …

数据治理新时代:筛斗数据如何推动企业数据价值的释放

【标题】数据治理新时代&#xff1a;筛斗数据如何引领企业数据价值的深度释放 在当今这个信息爆炸的时代&#xff0c;数据已成为企业最宝贵的资产之一&#xff0c;其潜在价值远超传统资源。然而&#xff0c;海量数据的涌现也带来了前所未有的挑战&#xff1a;如何高效、准确地…

【解码现代 C++】:实现自己的智能 【String 类】

目录 1. 经典的String类问题 1.1 构造函数 小李的理解 1.2 析构函数 小李的理解 1.3 测试函数 小李的理解 1.4 需要记住的知识点 2. 浅拷贝 2.1 什么是浅拷贝 小李的理解 2.2 需要记住的知识点 3. 深拷贝 3.1 传统版写法的String类 3.1.1 拷贝构造函数 小李的理…