-
1 <= m, n <= 50
-
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原理