【LeetCode刷题(中等程度)】695. 岛屿的最大面积

该篇博客介绍了一个使用深度优先搜索(DFS)算法解决二维数组中寻找最大岛屿面积的问题。题目要求在由0和1组成的矩阵中,找出由1(代表土地)构成的最大岛屿,并返回其面积。示例给出了不同情况的输入和输出。博主通过实现DFS函数,遍历矩阵并在遇到1时进行递归搜索,最终得到最大岛屿的面积。
摘要由CSDN通过智能技术生成

给定一个包含了一些 0 和 1 的非空二维数组 grid 。

一个 岛屿 是由一些相邻的 1 (代表土地) 构成的组合,这里的「相邻」要求两个 1 必须在水平或者竖直方向上相邻。你可以假设 grid 的四个边缘都被 0(代表水)包围着。

找到给定的二维数组中最大的岛屿面积。(如果没有岛屿,则返回面积为 0 。)

示例 1:

[[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:

[[0,0,0,0,0,0,0,0]]
对于上面这个给定的矩阵, 返回 0。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/max-area-of-island
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

思路:DFS算法,看注释应该写的很明白了。

class Solution {
public:
    int result = 0;
    int maxAreaOfIsland(vector<vector<int>>& grid) {
        vector<int>ans;
        for(int i = 0;i < grid.size();++i)
        {
            for(int j = 0;j < grid[0].size();++j)
            {
                if(grid[i][j] == 1)//如果当前位置是陆地
                {
                    dfs(grid,i,j);//则在当前位置启动dfs
                    if(result!=0)
                    {
                        ans.push_back(result);
                        result = 0;//重置计数器
                    }
                }
            }
        }
        return ans.size() > 0 ? *max_element(ans.begin(),ans.end()) : 0;
    }
    void dfs(vector<vector<int>>&grid,int i,int j)
    {
        //这里可以直接将元素置为-1来表示已经访问过
        //首先确认元素合法
        if(!(i>=0 && j >= 0 &&i < grid.size()&&j < grid[0].size()))
            return;
        if(grid[i][j] == 1)
        {
            grid[i][j] = -1;//表示已经被访问过
            result++;
        }
        else
        {
            //如果不是土地直接退出
            return;
        } 

        //向四个方向上启动
        dfs(grid,i-1,j);
        dfs(grid,i+1,j);
        dfs(grid,i,j-1);
        dfs(grid,i,j+1);
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值