一、题目
二、分析
图搜索问题,采用深度优先遍历。
遇到一个1
,即陆地,就先将其置为已查找
状态,然后往四周寻找陆地。
grid = [
[1, 1, 1, 1, 0],
[1, 1, 0, 1, 0],
[1, 1, 0, 0, 0],
[0, 0, 0, 1, 1]
]
遍历数组:
grid[0][0] = 1,则陆地数目+1.
然后深度优先遍历,找与之相邻的陆地,并在找到后置为“已查找状态”,比如以2标注。
......
grid = [
[2, 2, 2, 2, 0],
[2, 2, 0, 2, 0],
[2, 2, 0, 0, 0],
[0, 0, 0, 1, 1]
]
继续遍历数组,找一块即可。
三、代码
class Solution {
public:
int numIslands(vector<vector<char>>& grid) {
int m = grid.size(), n = grid[0].size();
int res(0);
for(int i = 0; i < m; i ++){
for(int j = 0; j < n; j ++){
if(grid[i][j] == '1'){
res ++;
dfs(grid, i, j, m, n);
}
}
}
return res;
}
void dfs(vector<vector<char>>& grid, int i, int j, int m, int n){
//如果是陆地,则继续dfs,否则回退
if(grid[i][j] == '1'){
grid[i][j] = '2';
if(i != 0) dfs(grid, i-1, j, m, n);
if(i != m-1) dfs(grid, i+1, j, m, n);
if(j != 0) dfs(grid, i, j-1, m, n);
if(j != n-1) dfs(grid, i, j+1, m, n);
}
else return;
}
};
执行用时:16 ms, 在所有 C++ 提交中击败了89.81%的用户
内存消耗:9.2 MB, 在所有 C++ 提交中击败了92.83%的用户