827. 最大人工岛 - 力扣(LeetCode)

给你一个大小为 n x n 二进制矩阵 grid 。最多 只能将一格 0 变成 1 。

返回执行此操作后,grid 中最大的岛屿面积是多少?

岛屿 由一组上、下、左、右四个方向相连的 1 形成。

示例 1:

输入: grid = [[1, 0], [0, 1]]
输出: 3
解释: 将一格0变成1,最终连通两个小岛得到面积为 3 的岛屿。

示例 2:

输入: grid = [[1, 1], [1, 0]]
输出: 4
解释: 将一格0变成1,岛屿的面积扩大为 4。

思路:首先求未变化前的grid的最大岛屿面积(相邻格为1的最大格子数)方法可以是(从grid[0][0]位置开始用深度优先遍历找相邻为1的格子数量),遍历变化某一格后的grid最大岛屿面积,并保存最大值返回

class Solution {
public://找到该grid最大岛屿数int find_max(vector<vector<int>> grid){int ret=0;for(int i=0;i<grid.size();i++){for(int j=0;j<grid.size();j++){int temp=0;if(grid[i][j]==0) continue;//该点可以当岛屿vector<vector<int>> temp_grid(grid);queue<pair<int,int>> q;q.push(make_pair(i,j));//设置i,j该点已经走过了temp_grid[i][j]=0;temp++;while(!q.empty()){//找4个方向是否有1且未插入pair<int,int> k=q.front();q.pop();if(k.first+1<grid.size()&&temp_grid[k.first+1][k.second]==1){q.push(make_pair(k.first+1,k.second));temp_grid[k.first+1][k.second]=0;temp++;}if(k.first-1>=0&&temp_grid[k.first-1][k.second]==1){q.push(make_pair(k.first-1,k.second));temp_grid[k.first-1][k.second]=0;temp++;} if(k.second+1<grid.size()&&temp_grid[k.first][k.second+1]==1){q.push(make_pair(k.first,k.second+1));temp_grid[k.first][k.second+1]=0;temp++;} if(k.second-1>=0&&temp_grid[k.first][k.second-1]==1){q.push(make_pair(k.first,k.second-1));temp_grid[k.first][k.second-1]=0;temp++;} }ret=max(ret,temp);}}return ret;}int largestIsland(vector<vector<int>>& grid) {int ret=0;//找到元素为0的下标for(int i=0;i<grid.size();i++){for(int j=0;j<grid.size();j++){vector<vector<int>> temp(grid);temp[i][j]=1;ret=max(find_max(temp),ret);}}return ret;}
};

但该方法因时间效率过高,会超出时间限制

优化思路:

1.对原始地图进行一次深搜,将不同的岛屿标记为不同的编号。

2.用哈希表记录每个编号对应的“岛屿”的面积,key为编号,val为面积。

3.之后再遍历一遍地图,如果某个小方格为0,就尝试把这个方格填平。并求出修改后对应岛屿面积=1(自己)+上下左右可能含有的编号对应面积

class Solution {
public:int largestIsland(vector<vector<int>>& grid) {int ret=1;unordered_map<int,int> m;//编号为0即面积为0m[0]=0;int num=1;vector<vector<int>> temp_grid(grid);for(int i=0;i<grid.size();i++){for(int j=0;j<grid.size();j++){//不是新岛屿重找if(temp_grid[i][j]!=1) continue;int temp=0;//新岛屿新编号num++;queue<pair<int,int>> q;q.push(make_pair(i,j));//设置i,j该点已经走过了temp_grid[i][j]=num;temp++;while(!q.empty()){//找4个方向是否有1pair<int,int> k=q.front();q.pop();if(k.first+1<grid.size()&&temp_grid[k.first+1][k.second]==1){q.push(make_pair(k.first+1,k.second));temp_grid[k.first+1][k.second]=num;temp++;}if(k.first-1>=0&&temp_grid[k.first-1][k.second]==1){q.push(make_pair(k.first-1,k.second));temp_grid[k.first-1][k.second]=num;temp++;} if(k.second+1<grid.size()&&temp_grid[k.first][k.second+1]==1){q.push(make_pair(k.first,k.second+1));temp_grid[k.first][k.second+1]=num;temp++;} if(k.second-1>=0&&temp_grid[k.first][k.second-1]==1){q.push(make_pair(k.first,k.second-1));temp_grid[k.first][k.second-1]=num;temp++;} }m[num]=temp;}}if(num==1) return 1;//找到元素为0的下标for(int i=0;i<grid.size();i++){for(int j=0;j<grid.size();j++){int temp=m[temp_grid[i][j]];if(grid[i][j]==0){temp++;//上下左右岛屿面积相加(需去重复的编号)unordered_set<int> s;if(i+1<grid.size()&&temp_grid[i+1][j]!=0) s.insert(temp_grid[i+1][j]);if(i-1>=0&&temp_grid[i-1][j]!=0) s.insert(temp_grid[i-1][j]);if(j+1<grid.size()&&temp_grid[i][j+1]!=0) s.insert(temp_grid[i][j+1]);if(j-1>=0&&temp_grid[i][j-1]!=0) s.insert(temp_grid[i][j-1]);for(int e:s){temp+=m[e];}}ret=max(ret,temp);}}return ret;}
};

9.18 困难力扣827. 最大人工岛相关推荐

  1. 力扣 827. 最大人工岛

    题目 给你一个大小为 n x n 二进制矩阵 grid .最多 只能将一格 0 变成 1 . 返回执行此操作后,grid 中最大的岛屿面积是多少? 岛屿 由一组上.下.左.右四个方向相连的 1 形成. ...

  2. (补)算法训练第七天|力扣454.四数相加II ,383. 赎金信,15. 三数之和,18. 四数之和

    代码随想录算法训练营第七天|力扣454.四数相加II ,383. 赎金信,15. 三数之和,18. 四数之和 454.四数相加II 题目链接:四数相加II 参考:https://programmerc ...

  3. 力扣刷题学习SQL篇——1-8 查询(按日期分组销售产品——利用聚合函数GROUP_CONCAT)

    力扣刷题学习SQL篇--1-8 查询(按日期分组销售产品--利用聚合函数GROUP_CONCAT) 1.题目 2.解法 3.group_concat() 1.题目 题目链接:https://leetc ...

  4. 力扣(LeetCode)刷题,简单题(第18期)

    目录 第1题:好数对的数目 第2题:返回倒数第k个节点 第3题:将每个元素替换为右侧最大元素 第4题:删除最外层的括号 第5题:6和9组成的最大数 第6题:搜索插入位置 第7题:判定字符是否唯一 第8 ...

  5. 【JAVA】交错字符串——力扣每日一题(六)(2020.07.18)

    目录 题目:97. 交错字符串 思路 如果你从本文中学习到丝毫知识,那么请您点点关注.点赞.评论和收藏 大家好,我是爱做梦的鱼,我是东北大学大数据实验班大三的小菜鸡,非常渴望优秀,羡慕优秀的人,个人博 ...

  6. ❤️导图整理数组5: 四数之和 相比 三数之和 的大量优化, 力扣18详细注解❤️

    此专栏文章是对力扣上算法题目各种方法的总结和归纳, 整理出最重要的思路和知识重点并以思维导图形式呈现, 当然也会加上我对导图的详解. 目的是为了更方便快捷的记忆和回忆算法重点(不用每次都重复看题解), ...

  7. 力扣——174.地下城游戏(困难难度)——万能的递归与动态分析

    力扣--174. 地下城游戏 一.算法目录合集 1.地址 2.说明 二.题目说明 1.题干 2.原地址 三.实现步骤 1.思路分析 1.1.分析问题 1.2.具体步骤 ① 特殊情况分析 ② 常规分析 ...

  8. 力扣——42.接雨水(困难难度)——条条大路通罗马

    力扣--42.接雨水 一.算法目录合集 1.地址 2.说明 二.题目说明 1.题干 2.原地址 三.实现步骤 1.思路分析 1.1.分析问题 1.2.转化问题 1.3.简化问题 1.4.具体步骤 ① ...

  9. 最大子序列和问题c语言力扣,力扣

    力扣刷题-第1题:两数之和2021-05-24 22:03:30 目录 一.写在最前面 二.题目信息 解题思路 一.写在最前面 致愿意重新开始努力的自己: 希望你能够持续的坚持,不半途而废. 二.题目 ...

最新文章

  1. java虚拟机改装_java虚拟机线上配置
  2. 无法打开文件“python35_d.lib”
  3. request对象_爬虫:request库的简介
  4. LinkedList 注意事项
  5. c++ 队列_RabbitMQ的死信与延迟队列,你真的会用吗?
  6. MATLAB实现频数直方图——hist的使用
  7. class在java中_class在java里是什么意思
  8. 马什么梅?I什么N?浅谈 web 前端开发中的国际化
  9. 两计算机之间怎样快速传输数据,两个局域网之间怎么互相传输文件有什么快速方法...
  10. [Storage]RPM series linux rescan disk / RPM系Linux重新扫描硬盘
  11. 微信小程序:UI好看的王者荣耀战力查询助手小程序源码
  12. 《Learning for Disparity Estimation through Feature Constancy》
  13. win7右键计算机没有注册类,win7系统提示没有注册类别如何解决
  14. 【论文解读】Exploring Complementary Strengths of Invariant and Equivariant Representations(小样本等变和不变的互补)
  15. 大数据掀人类文明革命 探索更多未知
  16. pytorch 计算 kl散度 F.kl_div()
  17. oracle mysql 卸载_Oracle完全卸载详解
  18. python使用for循环输出0~10之间的整数_用Python编写一个程序,使用for循环输出0~10之间的整数...
  19. 湖北出台禁犬令PHP 新闻,湖北省拟出台最严禁狗令,禁止饲养包括中华田园犬在内的多种狗狗...
  20. Nordic nRF52内部DCDC使能

热门文章

  1. 五一出行欢乐多。。。。
  2. 【我的OpenGL学习进阶之旅】解决着色器编译错误:#version directive must occur on the first line of the shader
  3. 梯度下降法(GD,SGD)总结
  4. 智能卡接口控制器(SIM)ATR应答
  5. c++中的初始化列表
  6. Sqlmap中文手册详解
  7. 单点登录系统(SSO)详细设计说明书
  8. 基于SadTalker的AI主播,Stable Diffusion也可用
  9. matlab 软启动程序,基于MATLAB的电动机软启动控制系统的仿真
  10. 微信跳转浏览器如何解决!