深度优先搜索在得到一个新节点时立即对新节点进行遍历
1、岛屿的最大面积
深度优先搜索
时间复杂度:O(R∗C)。其中 R是给定网格中的行数,C 是列数。我们访问每个网格最多一次。
空间复杂度:O(R∗C),递归的深度最大可能是整个网格的大小,因此最大可能使用 O(R∗C) 的栈空间。
class Solution {
int dfs(vector<vector<int>>& grid, int cur_i, int cur_j) {
//异常处理,直接返回
if (cur_i < 0 || cur_j < 0 || cur_i == grid.size() || cur_j == grid[0].size() || grid[cur_i][cur_j] != 1)
return 0;
//访问过的归零
grid[cur_i][cur_j] = 0;
//设定一个当前节点的四周点的变换数组
int di[4] = {
0, 0, 1, -1};
int dj[4] = {
1, -1, 0, 0};
int ans = 1;
for (int index = 0; index != 4; ++index) {
int next_i = cur_i + di[index], next_j = cur_j + dj[index];
//深度搜索直至搜索到最后一点,再返回
ans += dfs(grid, next_i, next_j);
}
return ans;
}
public:
int maxAreaOfIsland(vector<vector<int>>& grid) {
int ans = 0;
for (int i = 0; i != grid.size(); ++i)
for (int j = 0; j != grid[0].size(); ++j)
ans = max(ans, dfs(grid, i, j));
return ans;
}
};
深度优先搜索+栈
class Solution {
public:
int maxAreaOfIsland(vector<vector<int>>& grid) {
int ans = 0;
for (int i = 0; i != grid.size(); ++i)
for (int j = 0; j != grid[0].size(); ++j) {
int cur = 0;
stack<int> stacki;
stack<int> stackj;
stacki.push(i);
stackj.push(j);
while (!stacki.empty()) {
int cur_i = stacki.top(), cur_j = stackj.top();
stacki.pop();
stackj.pop();
if (cur_i < 0 || cur_j < 0 || cur_i == grid.size() || cur_j == grid[0].size() || grid[cur_i][cur_j] != 1)
continue;
++cur;
grid[cur_i][cur_j] = 0;
int di