一、题目描述:
给你一个大小为 m x n 的二进制矩阵 grid 。
岛屿 是由一些相邻的 1 (代表土地) 构成的组合,这里的「相邻」要求两个 1 必须在 水平或者竖直的四个方向上 相邻。你可以假设 grid 的四个边缘都被 0(代表水)包围着。
岛屿的面积是岛上值为 1 的单元格的数目。
计算并返回 grid 中最大的岛屿面积。如果没有岛屿,则返回面积为 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 解释:答案不应该是 11 ,因为岛屿只能包含水平或垂直这四个方向上的 1 。 示例 2:
输入:grid = [[0,0,0,0,0,0,0,0]] 输出:0
提示:
m == grid.length n == grid[i].length 1 <= m, n <= 50 gridi 为 0 或 1
二、思路分析:
根据需要,那么肯定需要逐一遍历整个数组,由于并不知道如何才可以测量出岛屿的面积,所以为了测量整个岛屿的面积,只能采取一步步探索的方式: 当登陆某个岛屿后,以此时所处位置为行动中心,随后分别向 东、南、西、北四个方向前进。如果向某一方向前进后其为‘0’或登记过的地方则停止探索,而当步入新地点时,则继续以当前所处位置为行动中心,随后再一次向 东、南、西、北 四个方向前进,以此类推。即这个部分将某一个点的上下左右四个点放进去,进行循环遍历 当某一个坐标点在二维矩阵中,并且= 1 是一个岛屿时,此时需要返回递归,继续四个方向上进行遍历
三、AC 代码:
class Solution { public int maxAreaOfIsland(int[][] grid) { int ans = 0; for (int i = 0; i != grid.length; ++i) { for (int j = 0; j != grid[0].length; ++j) { int cur = 0; Queue<Integer> queuei = new LinkedList<Integer>(); Queue<Integer> queuej = new LinkedList<Integer>(); queuei.offer(i); queuej.offer(j); while (!queuei.isEmpty()) { int cur_i = queuei.poll(), cur_j = queuej.poll(); if (cur_i < 0 || cur_j < 0 || cur_i == grid.length || cur_j == grid[0].length || grid[cur_i][cur_j] != 1) { continue; } ++cur; grid[cur_i][cur_j] = 0; int[] di = {0, 0, 1, -1}; int[] dj = {1, -1, 0, 0}; for (int index = 0; index != 4; ++index) { int next_i = cur_i + di[index], next_j = cur_j + dj[index]; queuei.offer(next_i); queuej.offer(next_j); } } ans = Math.max(ans, cur); } } return ans; } }
四、总结:
对于这种重复的操作,显然离不开循环或递归。在此题便是采用递归的方式解决。
写题解不易,若对你有帮助,点赞评论再走吧。ヽ(✿゚▽゚)ノ,如有不足,请大家斧正。