网易首页 > 网易号 > 正文 申请入驻

面试官出车祸了,面试要取消了。

0
分享至

专栏:50多种数据结构彻底征服

专栏:50多种经典图论算法全部掌握

一网友发文称面试被取消了,原因是面试官在路上出车祸了。不知道是真出车祸,还是已经找到合适的人不打算招了。如果是不打算招了,说明HR和面试官的关系很不好,不想招完全可以找个其他借口。我之前也遇到过面试取消的情况,面试的当天HR给出的理由是面试官出差去了,后面再约,结果直到我重新找到工作入职,也没见她约。

不过也有可能是真的,不能瞎猜,不知道大家在面试中有没有遇到取消的情况。

--------------下面是今天的算法题--------------

来看下今天的算法题,这题是LeetCode的第827题:最大人工岛。

问题描述

来源:LeetCode第827题

难度:困难

给你一个大小为 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。

  • n == grid.length

  • n == grid[i].length

  • 1 <= n <= 500

  • grid[i][j] 为 0 或 1

问题分析

这题说的是最多只能将一个 0 变成 1 ,然后求最大的岛屿面积,和我们之前讲的 类似。

我们可以按照之前的方式先计算所有岛屿的面积,然后尝试把 0 变成 1 ,计算最大面积。因为 0 变成的 1 的时候,两个本来不相连的岛屿可能会相连,岛屿的面积就会增大,如下图所示。

所以在计算完岛屿面积之后,需要再遍历一次二维数组,如果是 0 ,就尝试把它变成 1 ,然后把它的上下左右 4 个方向有岛屿的连在一起计算面积。

为了连接的时候防止岛屿有重复,我们需要把每个岛屿编上号,如果号码是一样的,说明他们是同一个岛屿,不能连接,如下图所示,红色 0 的上下位置是同一个岛屿,不能相加。

JAVA:

// 每一个岛屿的区域标记为一个不同的数字 public int largestIsland(int[][] grid) {     int length = grid.length;     Map
         
  mp =  new HashMap<>();      int ans =  0; // 保存最大的岛屿      int landNo =  2; // 岛屿编号从 2 开始      for ( int i =  0; i < length; i++) {          for ( int j =  0; j < length; j++) {              if (grid[i][j] ==  1) {                  int area = dfs(grid, i, j, length, landNo);                 mp.put(landNo++, area); // 保存到map中,岛屿编号也要累加                 ans = Math.max(ans, area);             }         }     }     Set  mySet =  new HashSet<>(); // 去掉重复的      for ( int i =  0; i < length; i++) {          for ( int j =  0; j < length; j++) {              // 如果遇到0,尝试把它的上下左右连接起来,保存最大面积。              if (grid[i][j] ==  0) {                  int up = i >  0 ? grid[i -  1][j] :  0;                  int down = i < length -  1 ? grid[i +  1][j] :  0;                  int left = j >  0 ? grid[i][j -  1] :  0;                  int right = j < length -  1 ? grid[i][j +  1] :  0;                  // 上下左右在连接之前肯定是不能相连的,如果是相连的,只能取一个                 mySet.clear();                 mySet.addAll(Arrays.asList(up, down, left, right));                  int tmp =  0;                  for ( int s : mySet) {                      if (s !=  0)                         tmp += mp.get(s);                 }                 ans = Math.max(ans, tmp +  1);             }         }     }      return ans; } // 通过dfs遍历当前位置的上下左右四个方向 private int dfs(int[][] grid, int i, int j, int length, int landNo) {      // 越界处理      if (i <  0 || i >= length || j <  0 || j >= length || grid[i][j] !=  1)          return  0;      int res =  1;     grid[i][j] = landNo; // 相连的标记为同一个岛屿     res += dfs(grid, i -  1, j, length, landNo); // 上     res += dfs(grid, i +  1, j, length, landNo); // 下     res += dfs(grid, i, j -  1, length, landNo); // 左     res += dfs(grid, i, j +  1, length, landNo); // 右      return res; }

C++:

public:     int largestIsland(vector

 > &grid) {         int length = grid.size();         unordered_map

  mp;         int ans = 0;// 保存最大的岛屿         // 每一个岛屿的区域标记为一个不同的数字         int landNo = 2;// 岛屿编号从 2 开始         for (int i = 0; i < length; i++) {             for (int j = 0; j < length; j++) {                 if (grid[i][j] == 1) {                     int area = dfs(grid, i, j, length, landNo);                     mp[landNo++] = area;// 保存到map中,岛屿编号也要累加                     ans = max(ans, area);                 }             }         }         unordered_set

  mySet;// 去掉重复的         for (int i = 0; i < length; i++) {             for (int j = 0; j < length; j++) {                 // 如果遇到0,尝试把它的上下左右连接起来,保存最大面积。                 if (grid[i][j] == 0) {                     int up = i > 0 ? grid[i - 1][j] : 0;                     int down = i < length - 1 ? grid[i + 1][j] : 0;                     int left = j > 0 ? grid[i][j - 1] : 0;                     int right = j < length - 1 ? grid[i][j + 1] : 0;                     // 上下左右在连接之前肯定是不能相连的,如果是相连的,只能取一个                     mySet.clear();                     mySet.insert(up);                     mySet.insert(down);                     mySet.insert(left);                     mySet.insert(right);                     int tmp = 0;                     for (int s: mySet) {                         if (s != 0)                             tmp += mp[s];                     }                     ans = max(ans, tmp + 1);                 }             }         }         return ans;     }     // 通过dfs遍历当前位置的上下左右四个方向     int dfs(vector

 > &grid, int i, int j, int length, int landNo) {         // 越界处理         if (i < 0 || i >= length || j < 0 || j >= length || grid[i][j] != 1)             return 0;         int res = 1;         grid[i][j] = landNo;// 相连的标记为同一个岛屿         res += dfs(grid, i - 1, j, length, landNo);// 上         res += dfs(grid, i + 1, j, length, landNo);// 下         res += dfs(grid, i, j - 1, length, landNo);// 左         res += dfs(grid, i, j + 1, length, landNo);// 右         return res;     }




Python:

def largestIsland(self, grid: List[List[int]]) -> int:     # 通过dfs遍历当前位置的上下左右四个方向     def dfs(i, j, length, landNo):         # 越界处理         if i < 0 or i >= length or j < 0 or j >= length or grid[i][j] != 1:             return 0         res = 1         grid[i][j] = landNo  # 相连的标记为同一个岛屿         res += dfs(i - 1, j, length, landNo)  # 上         res += dfs(i + 1, j, length, landNo)  # 下         res += dfs(i, j - 1, length, landNo)  # 左         res += dfs(i, j + 1, length, landNo)  # 右         return res     length = len(grid)     mp = {}     ans = 0  # 保存最大的岛屿     landNo = 2  # 岛屿编号从 2 开始     for i in range(length):         for j in range(length):             if grid[i][j] == 1:                 area = dfs(i, j, length, landNo)                 mp[landNo] = area  # 保存到map中,岛屿编号也要累加                 ans = max(ans, area)                 landNo += 1     for i in range(length):         for j in range(length):             # 如果遇到0,尝试把它的上下左右连接起来,保存最大面积。             if grid[i][j] == 0:                 up = grid[i - 1][j] if i > 0 else 0                 down = grid[i + 1][j] if i < length - 1 else 0                 left = grid[i][j - 1] if j > 0 else 0                 right = grid[i][j + 1] if j < length - 1 else 0                 # 上下左右在连接之前肯定是不能相连的,如果是相连的,只能取一个                 mySet = {up, down, left, right}  # 去掉重复的                 tmp = 0                 for s in mySet:                     if s != 0:                         tmp += mp[s]                 ans = max(ans, tmp + 1)     return ans

笔者简介

博哥,真名:王一博,毕业十多年, 作者,专注于 数据结构和算法 的讲解,在全球30多个算法网站中累计做题2000多道,在公众号中写算法题解800多题,对算法题有自己独特的解题思路和解题技巧,喜欢的可以给个关注,也可以 下载我整理的1000多页的PDF算法文档 。

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
吴月娘:我这浪肉,被男人摸一下真好

吴月娘:我这浪肉,被男人摸一下真好

老达子
2026-06-26 06:50:03
悬在科技头上的达摩克利斯之剑

悬在科技头上的达摩克利斯之剑

米筐投资
2026-06-26 07:10:02
顶级数学家有多么厉害多么离谱 看网友讲述我和他们真是云泥之别

顶级数学家有多么厉害多么离谱 看网友讲述我和他们真是云泥之别

侃神评故事
2026-06-17 14:45:10
六旬老人捡弃婴养20年,供到硕士毕业,但转头却被养女偷走保命钱

六旬老人捡弃婴养20年,供到硕士毕业,但转头却被养女偷走保命钱

行者聊官
2026-06-24 17:13:34
郭沫若去世六天后,邓小平批示:将悼词中的“伟大”改为“卓越”

郭沫若去世六天后,邓小平批示:将悼词中的“伟大”改为“卓越”

鹤羽说个事
2026-06-26 08:14:09
七大时,两位大将级人物落选中央委员:都找了毛主席,但态度不同

七大时,两位大将级人物落选中央委员:都找了毛主席,但态度不同

浩渺青史
2026-06-26 14:54:29
俄方警告无用,日本卷入俄乌冲突!中方表态很硬:必须坚决反对

俄方警告无用,日本卷入俄乌冲突!中方表态很硬:必须坚决反对

你得漂亮
2026-06-25 14:54:46
美加墨世界杯现场上座数已超360万,破32年前纪录 国际足联预计本届赛事累计现场观众将接近600万

美加墨世界杯现场上座数已超360万,破32年前纪录 国际足联预计本届赛事累计现场观众将接近600万

红星新闻
2026-06-26 09:41:11
离开火只差一步!菲律宾硬闯南海锁定中军舰,真当中国不敢动手?

离开火只差一步!菲律宾硬闯南海锁定中军舰,真当中国不敢动手?

未来展望
2026-06-26 01:42:50
伊朗没有赢下一场全面战争,却替中国废掉了美国一张最狠的牌

伊朗没有赢下一场全面战争,却替中国废掉了美国一张最狠的牌

贱议你读史
2026-06-24 19:35:03
左权牺牲后,无人能当彭总的参谋长,最后竟从毛主席身边挖走一人

左权牺牲后,无人能当彭总的参谋长,最后竟从毛主席身边挖走一人

芊芊子吟
2026-06-26 14:20:04
人民日报怒批机关事业单位的三大怪状,引基层人员共鸣!

人民日报怒批机关事业单位的三大怪状,引基层人员共鸣!

细说职场
2026-06-26 13:12:56
曝湖人尚未报价詹姆斯!第一时间致电只是问候 谈判无实质性进展

曝湖人尚未报价詹姆斯!第一时间致电只是问候 谈判无实质性进展

罗说NBA
2026-06-26 06:21:51
他抗命连开14枪,被关禁闭等待处罚,彭德怀说:给他连升三级!

他抗命连开14枪,被关禁闭等待处罚,彭德怀说:给他连升三级!

谈古论今历史有道
2026-06-25 08:10:06
985高校排名大洗牌,武大华科跻身前10,人大仅排17,西农不垫底

985高校排名大洗牌,武大华科跻身前10,人大仅排17,西农不垫底

华庭讲美食
2026-06-26 03:02:50
学医后才知道,骨质疏松最危险的信号,不是腰疼,而是这5种症状

学医后才知道,骨质疏松最危险的信号,不是腰疼,而是这5种症状

岐黄传人孙大夫
2026-06-19 21:20:03
真正刺痛韩国队的,并非淘汰出局,而是日本队交出的成绩单

真正刺痛韩国队的,并非淘汰出局,而是日本队交出的成绩单

十点街球体育
2026-06-26 00:20:03
深圳一考生8次模考“失利”,高考逆袭652分全家沸腾,爸爸直呼“没查错吧”

深圳一考生8次模考“失利”,高考逆袭652分全家沸腾,爸爸直呼“没查错吧”

极目新闻
2026-06-25 23:18:25
俄罗斯怒了!日本引进乌克兰无人机技术,中国在中间如何破局?

俄罗斯怒了!日本引进乌克兰无人机技术,中国在中间如何破局?

用冷眼洞悉世界
2026-06-26 17:00:30
焦点大战开打!CCTV5直播美国大满贯,莎头迎战张本兄妹冲击桂冠

焦点大战开打!CCTV5直播美国大满贯,莎头迎战张本兄妹冲击桂冠

观察鉴娱
2026-06-26 11:20:08
2026-06-26 18:44:49
数据结构和算法
数据结构和算法
专门介绍和写算法题解的号
273文章数 4关注度
往期回顾 全部

头条要闻

已有19支队伍晋级32强 盘点世界杯小组出线形势

头条要闻

已有19支队伍晋级32强 盘点世界杯小组出线形势

体育要闻

我在世界杯的每次奔跑,都为了证明你没看错

娱乐要闻

玥儿不回北京,马筱梅解释后妈身份

财经要闻

悬在科技头上的达摩克利斯之剑

科技要闻

拿了500亿的梁文锋,只挖地基,不信销售

汽车要闻

老板们的新座驾!65万元起,尊界V800/V680开启预订

态度原创

教育
房产
亲子
时尚
军事航空

教育要闻

全程免费!面向河南等省高一高二学生,海军工程大学夏令营开始报名

房产要闻

全国高考大放水,300分就能上本科!论上岸率,海南没输过!

亲子要闻

科普|备孕第一步:读懂身体“悄悄话”

盛夏,才要穿出松弛感!

军事要闻

伊朗:驶离指定航线船舶不享有安全保障

无障碍浏览 进入关怀版