看这道题不懂深度搜索的可以看看下面讲述
岛屿的最大面积
解题思路
代码
class Solution {int dfs(vector<vector<int>>& grid, int cur_i, int cur_j) {//确定边界if((cur_i >=0 && cur_i < grid.size()) && (cur_j >=0 && cur_j < grid[0].size())){//判断是否是陆地if(grid[cur_i][cur_j] == 0) return 0;else{grid[cur_i][cur_j] = 0;//在进行dfs深度遍历return 1+dfs(grid,cur_i-1,cur_j) + dfs(grid,cur_i+1,cur_j) +dfs(grid,cur_i,cur_j-1) + dfs(grid,cur_i,cur_j+1);}}else{return 0;}}
public:int maxAreaOfIsland(vector<vector<int>>& grid) {int count = 0;for(int i = 0;i< grid.size();i++){for(int j=0;j<grid[0].size();j++){count = max(count,dfs(grid,i,j));}}return count;}
};
时间复杂度O(i*j) 每次都会以二维数组中某一个点为起点,进行深度搜索。
空间复杂度O(I*J) 因为递归的最大情况是,所有数组的元素都是1,这样递归的深度最大就是数组的面积大小。
深度搜索
具体解释
深度搜素需要用到栈来实现
@ 1 第一步如果以0为起点 ,先输出0,再以(1,4,3)中其中任意一个邻接点进行深度搜索也就是递归。
@ 2 第二步,如果到达4,在到达4之前将0入栈,输出4
@ 3 第三步 ,到达下一个邻接点2,将4入栈,输出2.
@4 第四步,到达下一个邻接电1,将2入栈,输出1.
@5 第五步,访问1后,1没有邻接点,于是将栈出栈。
@6 第六步,出栈2,发现2有邻接点3,将3输出,3后没有没有访问的邻接点继续出栈
@7第七步,出栈4,0。栈空。程序截止。
下面举一个具体的深度搜索的例子
画一个横着的图: 4----2---0---1---3 从起始点0开始进行深搜。
结果是:02413 或者 01324.
#include <iostream>
#include <vector>
#include <stack>using namespace std;// 图的结构体,使用邻接表表示
struct Graph {int V; // 图的顶点数vector<vector<int>> adj; // 邻接表// 构造函数,初始化图的顶点数和邻接表Graph(int V) {this->V = V;adj.resize(V);}// 添加边,无向图void addEdge(int v, int w) {adj[v].push_back(w); // v 和 w 之间有一条边adj[w].push_back(v); // 因为是无向图,所以也要反向添加}// 深度优先搜索void DFS(int start) {// 记录访问状态的数组,初始都未访问过vector<bool> visited(V, false);// 使用栈来实现递归调用的效果stack<int> stack;// 将起始节点压入栈中stack.push(start);while (!stack.empty()) {// 弹出栈顶元素int v = stack.top();stack.pop();// 如果当前节点未访问过,则访问它if (!visited[v]) {cout << v << " ";visited[v] = true;}// 遍历当前节点的所有邻接节点for (int neighbor : adj[v]) {// 如果邻接节点未访问过,则压入栈中if (!visited[neighbor]) {stack.push(neighbor);}}}}
};int main() {// 创建一个包含 5 个顶点的图Graph g(5);// 添加边构成图g.addEdge(0, 1);g.addEdge(0, 2);g.addEdge(1, 3);g.addEdge(2, 4);cout << "深度优先搜索结果(从顶点0开始): ";g.DFS(0); // 从顶点 0 开始进行深度优先搜索return 0;
}
结果展示