青云算法面试题干货-生成最大的岛屿-LeetCode第827题

本文介绍了LeetCode第827题的解决方案,探讨如何在二维数组中找到最大岛屿面积,并在最多改变一个0的情况下最大化岛屿面积。通过将1视为图的节点,使用广度优先搜索遍历所有岛屿,同时分析了时间复杂度为O(n^2)的算法实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题:输入一个由数字0或1组成的二维数组,其中0表示海洋,而水平或竖直方向连通的1组成的区域为岛屿。岛屿的面积为组成岛屿的1的数目。如果最多能把数组中的一个0变成1,请问能得到的最大的岛屿的面积是多少?

例如,输入数组[[1, 0], [0, 1]],把其中任意一个0变成1都能将已有的两个面积为1的岛屿连接起来,形成一个面积为3的岛屿。

分析:这是LeetCode的第827题。 

另一个经典面试题的加强版是:输入一个由数字0或1组成的二维数组,其中0表示海洋,而水平或竖直方向连通的1组成的区域为岛屿。请问输入的数组中有多少个岛屿?

把数组中的1看成是图的节点。如果一个1与其他的1在水平或竖直方向相邻,那么,相当于图中对应的两个节点有边相连。因此,把找岛屿的过程转换成图的遍历:从任意一个1出发,遍历和它所有相连的1,从而遍历整个岛屿上的所有1。当然,我们在遍历岛屿的同时可以统计岛屿里的1的数目即岛屿的面积。

我们每遍历了一个值为1的节点,用一个布尔值标记这个节点已经被遍历过了。当一个岛屿上所有的1都被遍历完之后,可以去找下一个还没有被遍历到的值为1的节点。一旦找到一个还没有被遍历到的值为1的节点,就意味着又找到了一个之前没有到达的岛屿,于是接下来,我们遍历这个岛屿上的所有1。然后寻找下一个还没有被遍历到的值为1的节点。一直重复这个过程直到输入数组中所有1都被遍历为止。

这个过程可以用下面的Java代码来实现:

public int largestIsland(int[][] grid) {
    if (grid.length == 0 || grid[0].length == 0) {
        return 0;
    }

    int[][] islands = new int[grid.length][grid[0].length];
    Map<Integer, Integer&
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值