Leetcode 827. 最大人工岛 C++
Leetcode 827. 最大人工岛
题目
在二维地图上, 0代表海洋, 1代表陆地,我们最多只能将一格 0 海洋变成 1变成陆地。
进行填海之后,地图上最大的岛屿面积是多少?(上、下、左、右四个方向相连的 1 可形成岛屿)
测试样例
示例 1:
输入: [[1, 0], [0, 1]]
输出: 3
解释: 将一格0变成1,最终连通两个小岛得到面积为 3 的岛屿。
示例 2:
输入: [[1, 1], [1, 0]]
输出: 4
解释: 将一格0变成1,岛屿的面积扩大为 4。
示例 3:
输入: [[1, 1], [1, 1]]
输出: 4
解释: 没有0可以让我们变成1,面积依然为 4。
说明:
- 1 <= grid.length = grid[0].length <= 50
- 0 <= grid[i][j] <= 1
题解
并查集
我们先将相连的陆地加到同一个集合中,这样我们能得到多个集合。然后,我们遍历海洋,我们将其变成陆地,我们加上周围相连陆地所在集合的元素个数便是新岛的面积,这里需要注意一点,同一个集合只会计算一次,我们需要用一个set集合记录,避免重复计算。详细过程见代码
代码
class UF{public:vector<int> parent;vector<int> size;UF(int n){parent = vector<int>(n,0);size = vector<int>(n,1);for(int i=0; i<n; i++)parent[i] = i;}int find(int x){while(x != parent[x]){x = parent[x];}return x;}void Union(int x,int y){int pX = find(x);int pY = find(y);if(pX == pY) return;if(size[pX] > size[pY]){parent[pY] = pX;size[pX] += size[pY];}else{parent[pX] = pY;size[pY] += size[pX];}}int getSize(int x){return size[find(x)];}
};
class Solution {public:int largestIsland(vector<vector<int>>& grid) {int m = grid.size(),n = grid[0].size();int ans = 0;UF uf = UF(m*n);for(int i=0; i<m; i++){for(int j=0; j<n; j++){if(grid[i][j] == 1){if(i-1>=0 && grid[i-1][j]==1){uf.Union(i*n+j,(i-1)*n+j);}if(j-1>=0 && grid[i][j-1]==1){uf.Union(i*n+j,i*n+j-1);}ans = max(ans,uf.getSize(i*n+j));} }}int dir[4][2] = { {1,0},{0,-1},{-1,0},{0,1}};set<int> visit;for(int i=0; i<m; i++){for(int j=0; j<n; j++){if(grid[i][j] == 0){int now = 1;for(int k=0; k<4; k++){if(i+dir[k][0]>=0 && i+dir[k][0]<m && j+dir[k][1]>=0 && j+dir[k][1]<n){if(grid[i+dir[k][0]][j+dir[k][1]] == 1){int parent = uf.find((i+dir[k][0])*n+j+dir[k][1]);if(visit.find(parent) == visit.end()){visit.insert(parent);now += uf.getSize(parent);}}}}visit.clear();ans = max(ans,now);}}}return ans;}
};
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/making-a-large-island
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
Leetcode 827. 最大人工岛 C++相关推荐
- Leetcode 827.最大人工岛(Making A Large Island)
Leetcode 827.最大人工岛 1 题目描述(Leetcode题目链接) 在二维地图上, 0代表海洋, 1代表陆地,我们最多只能将一格 0 海洋变成 1变成陆地. 进行填海之后,地图上最大的 ...
- Java实现 LeetCode 827 最大人工岛(DFS+暴力模拟)
827. 最大人工岛 在二维地图上, 0代表海洋, 1代表陆地,我们最多只能将一格 0 海洋变成 1变成陆地. 进行填海之后,地图上最大的岛屿面积是多少?(上.下.左.右四个方向相连的 1 可形成岛屿 ...
- 力扣leetcode 827. 最大人工岛
文章目录 题目链接与描述 关键词:hash表 方法一: 运行截图 代码 结尾 题目链接与描述 https://leetcode.cn/problems/making-a-large-island/ 给 ...
- 图解LeetCode——827. 最大人工岛(难度:困难)
一.题目 给你一个大小为 n x n 二进制矩阵 grid .最多 只能将一格 0 变成 1 . 返回执行此操作后,grid 中最大的岛屿面积是多少? 岛屿 由一组上.下.左.右四个方向相连的 1 形 ...
- LeetCode 827 最大人工岛 题解
题目 给你一个大小为 n x n 二进制矩阵 grid .最多 只能将一格 0 变成 1 .返回执行此操作后,grid 中最大的岛屿面积是多少?岛屿 由一组上.下.左.右四个方向相连的 1 形成. 分 ...
- LeetCode 827 最大人工岛 C++
首先DFS遍历"自然"岛的时候,用一个数字位区分每个岛,具体想法是对每个岛进行编号,dfs的同时把1改为当前岛的编号,同时用一个map记录该编号岛的面积. 进入正式流程 遍历矩阵: ...
- LeetCode 827题 最大人工岛
LeetCode 827题 也是递归 class Solution {boolean isChanged = false;int count = 0;int resNum = 0;Map<Int ...
- 岛屿问题 通用解-463.岛屿周长-200.岛屿数量-695.岛屿的最大面积-827.最大人工岛
文章目录 岛屿问题 如何在网格上做DFS(通用解) 463.岛屿的周长 题目 题解 -通用模板 题解2 200.岛屿数量 题目 题解 695.岛屿的最大面积 题目 题解 827.最大人工岛 题目 题解 ...
- 9.18 困难力扣827. 最大人工岛
827. 最大人工岛 - 力扣(LeetCode) 给你一个大小为 n x n 二进制矩阵 grid .最多 只能将一格 0 变成 1 . 返回执行此操作后,grid 中最大的岛屿面积是多少? 岛屿 ...
最新文章
- Linux --进程间通信--共享内存
- 火山引擎向企业客户开放上万款抖音同款特效
- php怎么读取图片并输出,php读取图片内容并输出到浏览器的实现代码_PHP教程
- 会员管理scrm系统精细化运营更好促进成交
- 在UltraEdit中使用正则表达式
- 相同的研究手段,相反的研究结论例子
- 企业进销存管理系统_攻略 | 七巧Plus定制您的专属进销存管理系统
- SQLite移植手记1
- all方法 手写promise_我团队的一年前端实现Promise所有方法
- 重金悬赏丨2019 华为 IoT 开发者大赛喊你加入“群聊”,倾听科技的“声音”!...
- 使用 Design Pattern Toolkit 进行模型驱动的开发入门
- 酒店预订微信小程序怎么开发?
- Linux: 多线程
- envi查看灰度直方图_ENVI实习直方图匹配校正分类.doc
- 禁用uwebiview 的反弹功能 bounces
- spark 实现K-means算法
- 「前端进阶」JS中的内存管理
- 傍上阿里系大款,禧云国际如何守住“自由身”?
- php3d按钮,css3实现3D按钮效果的文章推荐
- 今日头条安卓_我为什么开始对今日头条和抖音反感了
热门文章
- 闲话网名之“intelboy”
- Openlayers使用geoserver发布的图层
- 项目实战:ASP.NET:C/S架构 大学BBS论坛项目(推荐★★★)
- 中移动在SOA和云计算融合发展的思考
- MathType下载和安装(与Visio搭配使用)
- 记录bat脚本启动IE11并启用ActiveX控件
- 【Scratch】青少年蓝桥杯_每日一题_4.07_画正六边形组成的图形
- PSP开发指南第五课
- STM32开源代码——YS-V0.7语音识别模块程序
- IT人员逃不过的35-40梗-对于新时代那些做互联网、零售电商人员的转型的深层思考