LC 695 岛屿的最大面积 DFS

简介: LC 695 岛屿的最大面积 DFS

给你一个大小为 m x n 的二进制矩阵 grid 。


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


岛屿的面积是岛上值为 1 的单元格的数目。


计算并返回 grid 中最大的岛屿面积。如果没有岛屿,则返回面积为 0 。


bb8f9934baef108dfc43dd3976f249ef.jpg


思路:这是一道很显然的深搜题目。通过这道题目对深搜加深的理解,很棒。


~深搜经常用递归来实现


构成递归需具备的条件:


1. 子问题须与原始问题为同样的事,且更为简单;


2. 不能无限制地调用本身,须有个出口,化简为非递归状况处理


题目要求最大连通块的面积


遍历每个结点 深搜 更新ans 输出


深搜:定义dfs(x,y)是以(x,y)为起点向外拓展的连通块面积


如果定义(x,y)上下左右结点分别为(x1,y1),(x2,y2),(x3,y3),(x4,y4);


那么dfs(x,y) = dfs(x1,y1)+dfs(x2,y2)+dfs(x3,y3)+dfs(x4,y4)


然后等式右边又可以继续递归下去


递归的基线条件:


       如果是海洋,返回值一定是0,如果坐标越界,返回值一定是0


如果不越界 且不是海洋,那么初始化sum(返回值:即连通块面积) = 1;


通过上述定义 sum加上四个方向上的增量,然后返回

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

奔赴热爱 奔赴山海 坚持算法 数学~

相关文章
|
前端开发 JavaScript 安全
从前端性能优化角度谈JavaScript代码压缩与混淆
本文从前端性能优化的角度出发,探讨了JavaScript代码压缩与混淆的重要性及实现方式,通过分析不同压缩混淆工具的特点和效果,为开发者提供了实用的指导和建议。
|
安全 网络安全 数据库
达梦数据库 忘记 SYSDBA 密码 处理方法
达梦数据库支持四种安全验证模式:数据库身份验证、基于操作系统的身份验证、外部身份验证和UKEY验证。当忘记SYSDBA密码时,可通过启用操作系统认证模式来恢复:修改`dm.ini`配置文件启用`ENABLE_LOCAL_OSAUTH = 1`,重启服务后,使用`disql / as sysdba`登录修改密码。之后,禁用操作系统认证,恢复原验证模式,确保数据库安全。
5177 0
Setup Factory 怎样让打包的程序在安装后自动运行
Setup Factory 怎样让打包的程序在安装后自动运行
419 0
|
Kubernetes 安全 API
Kubernetes系统安全-认证(Authentication)
文章主要介绍了Kubernetes系统中的安全认证机制,包括API服务器的访问控制、认证、授权策略和准入控制,以及如何使用kubeconfig文件和创建自定义用户与服务账号。
4780 0
Kubernetes系统安全-认证(Authentication)
|
存储 缓存 数据挖掘
《解锁反规范化设计的适用场景:数据库性能优化的深度洞察》
数据库设计中,规范化与反规范化是两种重要策略。规范化减少冗余、确保一致性,而反规范化通过增加冗余提升查询性能,适用于数据查询密集型场景、复杂分析与报表生成、历史数据与日志管理、分布式与缓存架构以及性能优化等场景。例如,在电商平台商品展示中,反规范化可避免多表连接,提高查询效率;在数据分析中,整合相关表简化查询逻辑;在日志管理中,集中存储提升性能。然而,反规范化会带来数据冗余和一致性维护的挑战,需根据业务需求权衡利弊,合理应用以构建高效稳定的数据库系统。
315 6
|
监控 安全 C#
使用C#如何监控选定文件夹中文件的变动情况?
使用C#如何监控选定文件夹中文件的变动情况?
464 19
|
Prometheus 监控 Kubernetes
在k8S中,状态码监控是怎么做的?
在k8S中,状态码监控是怎么做的?
|
SQL 大数据
常见大数据面试SQL-每年总成绩都有所提升的学生
一张学生成绩表(student_scores),有year-学年,subject-课程,student-学生,score-分数这四个字段,请完成如下问题: 问题1:每年每门学科排名第一的学生 问题2:每年总成绩都有所提升的学生
|
弹性计算 安全 Shell
修改 Linux 系统的最大打开文件数量
【4月更文挑战第29天】
222 1
|
网络协议 网络安全 数据安全/隐私保护
如何在IDEA中使用固定公网地址SSH远程连接服务器开发环境(三)
在IDEA中通过固定公网地址SSH远程连接服务器开发环境,需要配置固定TCP端口以避免地址随机变化。首先,升级cpolar至专业版及以上,然后在官网保留一个固定TCP地址。进入cpolar管理界面,编辑隧道信息,将保留的固定地址填入,更新隧道。最后,在IDEA中新建SSH连接,输入固定地址和端口,验证连接。成功后,即可稳定远程开发。