给定一个由 0 和 1 组成的非空二维数组 grid ,用来表示海洋岛屿地图。
一个 岛屿 是由一些相邻的 1 (代表土地) 构成的组合,这里的「相邻」要求两个 1 必须在水平或者竖直方向上相邻。你可以假设 grid 的四个边缘都被 0(代表水)包围着。
找到给定的二维数组中最大的岛屿面积。如果没有岛屿,则返回面积为 0 。
示例 1:
输入: grid = [[0,0,1,0,0,0,0,1,0,0,0,0,0],[0,0,0,0,0,0,0,1,1,1,0,0,0],[0,1,1,0,1,0,0,0,0,0,0,0,0],[0,1,0,0,1,1,0,0,1,0,1,0,0],[0,1,0,0,1,1,0,0,1,1,1,0,0],[0,0,0,0,0,0,0,0,0,0,1,0,0],[0,0,0,0,0,0,0,1,1,1,0,0,0],[0,0,0,0,0,0,0,1,1,0,0,0,0]]
输出: 6
解释: 对于上面这个给定矩阵应返回 6。注意答案不应该是 11 ,因为岛屿只能包含水平或垂直的四个方向的 1 。
示例 2:
输入: grid = [[0,0,0,0,0,0,0,0]]
输出: 0
思路:利用并查集解题
class Solution { public int maxAreaOfIsland(int[][] grid) { UnionFindCollection unionFind = new UnionFindCollection(grid); for (int i = 0; i < grid.length; i++) { for (int j = 0; j < grid[i].length; j++) { if (grid[i][j] == 1) { if (i > 0 && grid[i-1][j] == 1) { unionFind.unit(i,j, i-1, j); } if (j > 0 && grid[i][j-1] == 1) { unionFind.unit(i,j, i, j-1); } } } } return unionFind.maxSize; } } /** * 并查集 */ class UnionFindCollection { //父节点下标 int[] parent; //点集 int[] size; //堆集 int cnt; int row; int col; //最大面积 int maxSize; public UnionFindCollection(int[][] grid) { int row = grid.length; int col = grid[0].length; this.row = row; this.col = col; this.cnt = row * col; this.parent = new int[this.cnt]; this.size = new int[this.cnt]; int num = 0; for (int i = 0; i < row; i++) { for (int j = 0; j < col; j++) { parent[num] = num; if (grid[i][j] == 1) { size[num]= 1; maxSize = 1; } num++; } } } public void unit(int x, int y, int x1, int y1) { int px = findParent(x,y); int py = findParent(x1, y1); if (px == py) { return; } parent[py] = px; size[px] = size[px] + size[py]; if (size[px] > maxSize) { maxSize = size[px]; } cnt--; } public int findParent(int x, int y) { int index = col * x + y; if (parent[index] == index) { return index; } else { int row = parent[index] / col; int col1 = parent[index] - row * col; return findParent(row, col1); } } }