看了一下感觉和二叉树,和回溯,没啥区别。
普通回溯,很快
path.push_back(0);要提前写不要忘了。另外path不要担心不需要归零,他每次回溯call完了会退回去的
vector> res;
vector path;
void dfs(int node, int n,vector>& graph){
if(node==n-1){
res.push_back(path);
return;
}
for(int &adj:graph[node]){
path.push_back(adj);
dfs(adj,n,graph);
path.pop_back();
}
}
vector> allPathsSourceTarget(vector>& graph) {
int n=graph.size();
path.push_back(0);
dfs(0,n,graph);
return res;
}
先来对比下dfs,对于二叉树:递归遍历是dfs(前中后序),层序迭代遍历是bfs
“bfs适合于解决两个点之间的最短路径问题。因为bfs从起点出发,以起始点为中心一圈一圈进行搜索,一旦遇到终点,记录之前走过的节点就是一条最短路。(走到最短路就不会找其他的了)
也有一些问题是广搜 和 深搜都可以解决的,例如岛屿问题,这类问题的特征就是不涉及具体的遍历方式,只要能把相邻且相同属性的节点标记上就行” 只要BFS只要搜到终点一定是一条最短路径
存放容器:
能保存我们要遍历过的元素就可以,那么用队列,栈,甚至数组都可以。
if queue:保证每一圈都是一个方向去转,例如统一顺时针或者逆时针。因为队列是先进先出,加入元素和弹出元素的顺序是没有改变的。
if stack: 就是第一圈顺时针遍历,第二圈逆时针遍历,第三圈有顺时针遍历。因为栈先进后出,加入元素和弹出元素的顺序改变了。
那么广搜不需要注意转圈搜索的顺序。所以队列栈都是可以,但大家都习惯用队列了,所以下面的讲解用我也用队列来讲,只不过要给大家说清楚,并不是非要用队列,用栈也可以。
广搜我还是不熟练,自己写的很有问题。基础模板要掌握
此题易错注意:加入队列就代表走过,就需要标记,而不是从队列拿出来的时候再去标记走过。如果从队列拿出节点,再去标记这个节点走过,会导致很多节点重复加入队列
bfs思路:遍历每一个格子ij,格子not visited 而且为1就res++,然后把他的相邻都走一遍设为visited。然后继续ij遍历
易错:grid里面是char,是要和'1'比较而不是int 1
一些写法学习: 1 push pair可以 que.push({x,y}); 比 que.push(make_pair(x,y));简洁
2. int dir[4][2] = {{0, 1}, {1, 0}, {-1, 0}, {0, -1}}; 和int dir[4][2]={0,1,0,-1,1,0,-1,0}; 是一样的,后面可以这么写是因为c++优先把已有的ary填满。二维数组是ary一行行下来的
int dir[4][2]={0,1,0,-1,1,0,-1,0};
void bfs(int x,int y,int n, int m,vector> &v,vector>& grid){
queue> que;
que.push({x,y});
v[x][y]=true;
while(!que.empty()){
auto cur=que.front(); que.pop();
int curx=cur.first;
int cury=cur.second;
for(int i=0;i<4;i++){
int nextx=curx+dir[i][0];
int nexty=cury+dir[i][1];
if(nextx<0||nextx>=n||nexty<0||nexty>=m) continue;
if(v[nextx][nexty]==false&&grid[nextx][nexty]=='1'){
que.push({nextx,nexty});
v[nextx][nexty]=true;
}
}
}
}
int numIslands(vector>& grid) {
int n=grid.size();
int m=grid[0].size();
vector> v(n,vector(m,false));
int res=0;
for(int i=0;i
int dir[4][2]={0,1,0,-1,1,0,-1,0};
void dfs(int curx,int cury,int n, int m,vector> &v,vector>& grid){
for(int i=0;i<4;i++){
int nextx=curx+dir[i][0];
int nexty=cury+dir[i][1];
if(nextx<0||nextx>=n||nexty<0||nexty>=m) continue;
if(v[nextx][nexty]==false&&grid[nextx][nexty]=='1'){
v[nextx][nexty]=true;
dfs(nextx,nexty,n,m,v,grid);
}
}
}
int numIslands(vector>& grid) {
int n=grid.size();
int m=grid[0].size();
vector> v(n,vector(m,false));
int res=0;
for(int i=0;i