问题:输入一个由数字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&