[算法题解详细]DFS解力扣695岛屿的最大面积

题目

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

提示

 1. m == grid.length
 2. n == grid[i].length
 3. 1 <= m, n <= 50
 4. grid[i][j]01

思路

首先这是一个大小为 m x n 的二进制矩阵 grid,这就说明矩阵内只有01两个数值,1代表陆地,0代表水域,这题就是让我们求解连接在一起的1的最大数量,并且连接方向也给出了是水平或者竖直的四个方向,这题和昨天那题岛屿的周长比较类似,我们也需要对这个矩阵进行一次遍历,每次遍历到的点如果是1且未访问过则进入dfs,然后在访问完当前点之后再访问当前点的上下左右四个方向的点,递归搜索判断,下面我们进入代码。

代码

首先是主函数中的对矩阵的遍历

class Solution {
    
    
	int m, n;
	int maxAreaOfIsland(vector<vector<int>>& grid) {
    
    
			m = int(grid.size());
	        n = int(grid[0].size());
	        for(int i = 0; i < m; i++) {
    
    
	            for(int j = 0; j < n; j++) {
    
    
	                dfs(grid, i, j);
	            }
	        }
	}
}

然后我们需要记录每一次dfs搜索的陆地大小并且与当前记录的最大大小进行一个求较大值(当前的大小我们用res记录,赋初值为-1是为了让它为最小)因为这个记录数需要在主函数且dfs函数里都出现,所以跟m,n一样定义到类里

class Solution {
    
    
	int m, n;
	int count = 0;
	int maxAreaOfIsland(vector<vector<int>>& grid) {
    
    
			m = int(grid.size());
	        n = int(grid[0].size());
	        for(int i = 0; i < m; i++) {
    
    
	            for(int j = 0; j < n; j++) {
    
    
	                count = 0;
	                dfs(grid, i, j);
	                res = max(res, count);
	            }
	        }
	}
}

然后是dfs函数,在进入dfs后对每个访问的点进行标记,出口条件仍然是坐标越界或者当前点值为0或2(代表水域或者已访问过)

void dfs(vector<vector<int>>& grid, int x, int y) {
    
    
        if(x < 0 || x >= m || y < 0 || y >= n || grid[x][y] != 1 || grid[x][y] == 2) {
    
    
            return;
        }
        grid[x][y] = 2;
        dfs(grid, x + 1, y);
        dfs(grid, x - 1, y);
        dfs(grid, x, y + 1);
        dfs(grid, x, y - 1);
}

这里还要注意一点,我们需要在访问并且标记完当前点后把count值+1,代表当前陆地面积值+1,下面是完整代码
完整代码:

class Solution {
    
    
public:
    int m, n;
    int count = 0;
    void dfs(vector<vector<int>>& grid, int x, int y) {
    
    
        if(x < 0 || x >= m || y < 0 || y >= n || grid[x][y] != 1 || grid[x][y] == 2) {
    
    
            return;
        }
        grid[x][y] = 2;
        ++count;
        dfs(grid, x + 1, y);
        dfs(grid, x - 1, y);
        dfs(grid, x, y + 1);
        dfs(grid, x, y - 1);
    }
    int maxAreaOfIsland(vector<vector<int>>& grid) {
    
    
        int res = -1;
        m = int(grid.size());
        n = int(grid[0].size());
        for(int i = 0; i < m; i++) {
    
    
            for(int j = 0; j < n; j++) {
    
    
                count = 0;
                dfs(grid, i, j);
                res = max(res, count);
            }
        }
        return res;
    }
};

猜你喜欢

转载自blog.csdn.net/m0_61607810/article/details/121071865