【力扣分模块联系】DFS与BFS

695. 岛屿的最大面积 深度优先,返回int

题意:给定一个包含了一些 0 和 1 的非空二维数组 grid 。
一个 岛屿 是由一些相邻的 1 (代表土地) 构成的组合,这里的「相邻」要求两个 1 必须在水平或者竖直方向上相邻。你可以假设 grid 的四个边缘都被 0(代表水)包围着。
找到给定的二维数组中最大的岛屿面积。(如果没有岛屿,则返回面积为 0 。)
如:
输入:
[[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

传统的dfs在Pta考试中已经练得很熟练了,这里梳理了一遍做法
1.利用一个数组 {-1,0,1,0,-1} 通过i 和i + 1的控制,可以完美表示出上下左右四个方向行与列坐标的变化。
2.递归有两种写法,
一种是不管三七二十一,直接调用下一层递归,然后再到下一步搜索的开始时(第一行)进行判断是否合法。
第二种是先判断是否越界,再决定是否要调用下一层。(个人比较熟悉这个第二种)

注意本题需要在遍历到某个点grid【i】【j】后,把这个点变为0,以免在主函数中的循环遍历中,重复计算这个点。

class Solution {
public:
	int dirac[5] = { -1,0,1,0,-1 };

	int maxAreaOfIsland(vector<vector<int>>& grid) {
		if (grid.empty() && grid[0].empty())
			return 0;

		int maxnum = 0;
		for (int i = 0; i < grid.size(); i++)
		{
			for (int j = 0; j < grid[0].size(); j++)
			{
				if (grid[i][j] == 1)
				{
					int ans = dfs(grid, i, j);
					if (ans > maxnum)
						maxnum = ans;
				}
			}
		}
        return maxnum;
	}
private:
	int dfs(vector<vector<int>>& grid, int r, int c)
	{
		if (grid[r][c] == 0)
			return 0;
		grid[r][c] = 0; //遍历到之后改变原图,避免重复遍历

		int x, y, area = 1;
		for (int i = 0; i < 4; i++)
		{
			x = r + dirac[i];
			y = c + dirac[i + 1];  //四个方向

			if (x >= 0 && x < grid.size() && y >= 0 && y < grid[0].size())
				area += dfs(grid, x, y);
		}
		return area;
	}
};
上一篇:golang实现算法题合集一


下一篇:根据G的邻接表生成G的反向邻接表