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

文章介绍了如何利用深度优先搜索(DFS)算法解决一个关于二进制矩阵的问题,目标是找到由1表示的陆地单元格,按照水平或竖直方向连接的最大面积。作者提供了代码实现步骤和注意事项,展示了在IT技术面试中可能遇到的相关问题背景。
摘要由CSDN通过智能技术生成
  1. 1 <= m, n <= 50

  2. grid[i][j] 为 0 或 1

思路


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

代码


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

class Solution {

int m, n;

int maxAreaOfIsland(vector<vector>& 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>& 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>& 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>& 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);

最后

在面试前我花了三个月时间刷了很多大厂面试题,最近做了一个整理并分类,主要内容包括html,css,JavaScript,ES6,计算机网络,浏览器,工程化,模块化,Node.js,框架,数据结构,性能优化,项目等等。

包含了腾讯、字节跳动、小米、阿里、滴滴、美团、58、拼多多、360、新浪、搜狐等一线互联网公司面试被问到的题目,涵盖了初中级前端技术点。

  • HTML5新特性,语义化

  • 浏览器的标准模式和怪异模式

  • xhtml和html的区别

  • 使用data-的好处

  • meta标签

  • canvas

  • HTML废弃的标签

  • IE6 bug,和一些定位写法

  • css js放置位置和原因

  • 什么是渐进式渲染

  • html模板语言

  • meta viewport原理

  • 14
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值