DFS深搜与BFS广搜专题

一般搜索算法的流程框架

DFS和BFS与一般搜索流程的关系

如果一般搜索算法流程4使用的是stack栈结构(先进后出,后进先出)那么就会越搜越深。即,DFS,DFS只保存当前一条路径,其目的是枚举出所有可能性。反之,如果流程4使用的是queue队列结构(先进先出)那么就会先处理相邻的,然后再进入下一层,即,BFS

递归DFS的流程框架

 用栈的DFS和用递归的DFS区别

46. 全排列

思路

DFS + 回溯

code

#include<iostream>using namespace std;const int N = 10;int n = 3;
//最终输出
int path[N];
//记录当前使用过的数
int st[N];void dfs(int u)
{//达到阈值if (u == n){for (int i = 0; i < n; i++)printf("%d ", path[i]);puts("");return;}for (int i = 1; i <= n; i++){if (!st[i]){//存入当前内容path[u] = i;//标记当前数已使用st[i] = true;//进入下一层dfs(u + 1);//dfs结束恢复现场path[u] = 0;st[i] = false;}}
}int main()
{dfs(0);return 0;
}

DFS代码深层分析

1.首先需要两个全局定义,一个用来存储已经使用过的内容st,一个用来存储需要的内容path

2.首选处理第一个需要处理的位置位置u == 0,进入dfs中首先判断是否达到既定目标,u == n,如果没有达到,说明还没有走到尽头,继续执行

3.在进入for循环中后,首先针对u == 0需求位置,寻找合适的内容填入,for第一层循环i = =1开始进行判断,判断i == 1是否使用过,如果没有使用过,就把它加入到需求记录path[u]中,并且标记为i == 1已经使用过,本次需求位置u == 0的位置结束,进入下一个需求位置 u + 1(u == 1)

4.进入新的需求的位置后,依然判断是否达成条件,没达成继续进入for循环,此时全局记录的位置i = =1被使用过,所以来到i = = 2处使用,当本次需求位置处理完毕后 u == 1,继续进入下一个需要处理的位置 u  + 1 (u == 2)

5.当i == 3时候所有需求处理完毕,在进入循环(第四次处理的时候)触发了满足条件,直接输出了完整的path[u]内容,然后回到了上次处理,因为for中i = 3了,所以此次处理结束,回溯到上一次,并且重置条件,即 i = 2相关全部清理,然后继续i++ 为3,此时的需求依然是u + 1 = 2的情况,只不过是for为3把i = 3的情况加入到了需求位置,然后进入了下一层u + 1的循环,这样做的目的是for宗到i++保证了是一直向前的状态,再次进入到u + 1中处理的就是最后一个需求位置了,所以当查询到i = 2的时候就执行填入了,满足了所有需求输出。以此类推,输出全部可能性。

class Solution {
public:vector<vector<int>> ans;vector<bool> st;vector<int> path;vector<vector<int>> permute(vector<int>& nums) {for (int i = 0; i < nums.size(); i ++ ) st.push_back(false);dfs(nums, 0);return ans;}//nums为当前处理序列,u为当前要处理的位置void dfs(vector<int> &nums, int u){if (u == nums.size()){ans.push_back(path);return ;}for (int i = 0; i < nums.size(); i ++ )if (!st[i]){st[i] = true;path.push_back(nums[i]);dfs(nums, u + 1);st[i] = false;path.pop_back();}}};

N皇后问题

#include <iostream>using namespace std;const int N = 20;int n;
char g[N][N];
bool col[N], dg[N], udg[N];void dfs(int u)
{//u代表当前处理的行if (u == n){for (int i = 0; i < n; i ++ ) puts(g[i]);puts("");return;}//对每一行的每个列位置进行枚举处理for (int i = 0; i < n; i ++ )if (!col[i] && !dg[u + i] && !udg[n - u + i]){g[u][i] = 'Q';col[i] = dg[u + i] = udg[n - u + i] = true;dfs(u + 1);col[i] = dg[u + i] = udg[n - u + i] = false;g[u][i] = '.';}
}int main()
{cin >> n;for (int i = 0; i < n; i ++ )for (int j = 0; j < n; j ++ )g[i][j] = '.';dfs(0);return 0;
}

104. 二叉树的最大深度

思路

递归求解:
当前树的最大深度等于左右子树的最大深度加1。

时间复杂度分析:树中每个节点只被遍历一次,所以时间复杂度是 O(n)。

code

class Solution {
public:int maxDepth(TreeNode* root) {if(!root)return 0;return max(maxDepth(root->left),maxDepth(root->right)) + 1;}
};







111. 二叉树的最小深度

思路

深度只对叶子节点有效,对内部节点无效。

对于每个节点:

如果树根为空,则返回0。

如果没有子节点,说明是叶节点,则返回1;
如果有子节点,说明是内部结点,则返回子节点的深度的最小值 + 1(加上根节点这层);
时间复杂度分析:每个节点仅被遍历一次,且遍历时所有操作的复杂度是 O(1),所以总时间复杂度是 O(n)。

以本题20为计算节点高度,其左子树高度为1,右子树高度为1,取min 然后加上20这一层,20的高度为2。递推到3的时候 9的高度为1,20的高度为2,min为1,加上1为2。为最终答案

code

class Solution {
public:int minDepth(TreeNode* root) {if (!root) return 0;int res = INT_MAX;if (root->left) res = min(res, minDepth(root->left) + 1);if (root->right) res = min(res, minDepth(root->right) + 1);if (res == INT_MAX) res = 1;return res;}
};

17. 电话号码的字母组合

思路

code

//非递归方式
class Solution {
public:string chars[8] = {"abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};vector<string> letterCombinations(string digits) {//判空if(digits.empty())return vector<string>();vector<string>state(1,"");for(auto u:digits){vector<string> now;//char[u - '2'] 用来确定当前号码是哪个区间取值for(auto c:chars[u - '2'])for(auto s:state)//(s + r)采用字符追加方式now.push_back(s + c);//更新外部存储     state = now;     }return state;}
};//递归方式
class Solution {
public:vector<string> ans;string strs[10] = {"", "", "abc", "def","ghi", "jkl", "mno","pqrs", "tuv", "wxyz",};vector<string> letterCombinations(string digits) {if (digits.empty()) return ans;dfs(digits, 0, "");return ans;}void dfs(string& digits, int u, string path) {if (u == digits.size()) ans.push_back(path);else {for (auto c : strs[digits[u] - '0'])dfs(digits, u + 1, path + c);}}
};

94. 二叉树的中序遍历

思路:

因为中序遍历采用【左根右】的形式,从根结点向子树深处搜索,所以使用DFS进行深度优先遍历。

code

class Solution {
public:vector<int>res;vector<int> inorderTraversal(TreeNode* root) {dfs(root);    return res;}void dfs(TreeNode* root){if(!root)return;dfs(root->left);res.push_back(root->val);dfs(root->right);}};

200. 岛屿数量

思路:Flood Fill算法

class Solution {
public:vector<vector<char>> g;int dx[4] = {-1, 0, 1, 0}, dy[4] = {0, 1, 0, -1};int numIslands(vector<vector<char>>& grid) {g = grid;int cnt = 0;for (int i = 0; i < g.size(); i ++ )for (int j = 0; j < g[i].size(); j ++ )if (g[i][j] == '1') {dfs(i, j);cnt ++ ;}return cnt;}void dfs(int x, int y) {//染色   g[x][y] = 0;for (int i = 0; i < 4; i ++ ) {int a = x + dx[i], b = y + dy[i];if (a >= 0 && a < g.size() && b >= 0 && b < g[a].size() && g[a][b] == '1')dfs(a, b);}}
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/335827.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

cloud foundry_使用“另类” Cloud Foundry Gradle插件无需停机

cloud foundry我一直在尝试编写用于将应用程序部署到Cloud Foundry的gradle插件 &#xff0c;并在上一篇文章中写了有关此插件的文章 。 现在&#xff0c;我通过使用两种方法支持将无停机时间部署到Cloud Foundry中来增强此插件&#xff1a; 自动驾驶风格部署和更常用的蓝绿色风…

lisp文字上标源码_创建文本/标注样式源码 - AutoLISP/Visual LISP 编程技术 - CAD论坛 - 明经CAD社区 - Powered by Discuz!...

本帖最后由 zhengxiansz 于 2014-4-27 11:27 编辑GU_xl你好&#xff01;请帮我看一下这个创建文本/标注样式源码。第一次输入IT1命令时没有报错的提示。如果重复输入IT1命令时就会提示该名称已被使用&#xff0c;是否重新定义&#xff1f;请问有什么方法可以解决吗&#xff1f;…

从前有座山,山里有座庙:递归之法

递归描述 递归调用是函数内部调用自身的过程&#xff0c;递归必须要有结束条件&#xff0c;否则会进入无限递归状态。无法停止。 我们称这个条件为&#xff08;递归基&#xff09; 递归原理 递归包括&#xff08;递推&#xff09;和&#xff08;回归&#xff09;&#xff0c;…

你只是看起来很努力_我的方法在这方面看起来很大吗?

你只是看起来很努力以下Java方法的大小是多少&#xff1f; public Collection getDescription() {SystemLibrary systemLib registry.get(SystemLibrary.class);Analysis analysis systemLib.getCurrentAnalysis(registry);return getDescription(analysis);}这个不起眼的方…

0xFFFFFF的问题

这个有两个结果&#xff1a;16777215和-1 如果是单纯的16 进制数&#xff0c;那么转换为10 进制数为16777215。相信这个转换结果很好理解&#xff1a;15*16^015*16^1...15*16^5。j即&#xff08;int型所能表示的最大值&#xff09; 第二种情况就是 0xFFFFFF 如果是在计算机中…

js模仿f11全屏_JS实现全屏预览F11功能的示例代码

老是不通过&#xff0c;没办法&#xff0c;只能是重新发布了&#xff0c;反正我就是杠上了&#xff0c;大大小小写过很多前端特效&#xff0c;当然也经常在网上copy或者修改人家的代码&#xff0c;我觉得也挺好的&#xff0c;为什么&#xff1f;&#xff01;因为我想这样&#…

懒惰学习_懒惰评估

懒惰学习最近&#xff0c;我正在编写log4j附加程序&#xff0c;并希望在自定义附加程序创建过程中使用logger记录一些诊断详细信息&#xff0c;但是log4j初始化仅在创建附加程序实例后才完成&#xff0c;因此在此阶段记录的消息将被忽略。 我感到需要在自定义附加程序中进行延…

leetcode(动态规划专题)

线性DP 53. 最大子数组和 思路 code int maxSubArray(vector<int>& nums) {//res:最后所有状态的最终Max结果//lat:当前f[i]状态的Maxint res INT_MIN, last 0;for (int i 0; i < nums.size(); i){//当前f[i]状态最大值(使用下面的状态转移方程得出)//f[i] …

买个云服务器有啥用_买了一台云服务器到底能干嘛?

提起云计算、大数据&#xff0c;好像都属于科技前沿的东西&#xff0c;总是觉得它离我们很遥远。但是科技的发展应该是要惠及普罗大众的&#xff0c;所以云计算的发展也并不是与我们毫不相干的&#xff0c;很多云计算方面的功能是我们工作生活可以用到、并解决问题的&#xff0…

leetcode(链表专题)

数组模拟链表 #include<iostream> using namespace std;const int N 100; // 单链表 // head存储链表头&#xff0c;e[]存储节点的值&#xff0c;ne[]存储节点的next指针&#xff0c;idx表示当前用到了哪个节点 int head, e[N], ne[N], idx;// 初始化 void init() {hea…

lagom cqrs_Java和Lagom的CQRS

lagom cqrs我很高兴在Chicago Java User Group上进行了讨论&#xff0c;并讨论了Lagom如何实现CQRS&#xff08;命令查询责任隔离模式&#xff09;。 值得庆幸的是&#xff0c;有一个录音&#xff0c;我还把这些幻灯片发布在slideshare上 。 抽象&#xff1a; 一旦应用程序变…

python项目管理器 宝塔面板 django 404_宝塔面板成功部署Django项目流程(图文)

上线 Django 项目记录&#xff0c;超简单&#xff0c;避免无意义的踩坑&#xff01;第一步&#xff1a;安装python管理器在宝塔在线面板安装“ python项目管理器 ”第二步&#xff1a;安装适配python版本因为服务器 centos7 系统默认的 python 版本是 2.7而我们项目是基于最新版…

leetcode(字符串专题)

5. 最长回文子串 思路

使用Spring boot,Thymeleaf,AngularJS从零开始构建新的Web应用程序–第3部分

在之前的博客中&#xff0c;我们使用Thymeleaf&#xff0c;Bower和Bootstrap构建了登录页面&#xff0c;并将其部署到了Heroku。 在此博客中&#xff0c;我们将介绍用于前端的AngularJS和在后端的Spring Boot Web服务的一些功能。 我们将从“登录/注销”部分开始。 让我们开始…

android的oomkiller_Android Low memory killer

Android Low memorykillerby 永远的伊苏Android中&#xff0c;进程的生命周期都是由系统控制的&#xff0c;即使用户关掉了程序&#xff0c;进程依然是存在于内存之中。这样设计的目的是为了下次能快速启动。当然&#xff0c;随着系统运行时间的增长&#xff0c;内存会越来越少…

C++ 11 深度学习(十二)函数新特性、内联函数、const详解

函数后置返回类型 //后置返回类型 auto fun(int, int)->int; 内联函数 在函数定义前增加关键字 inline ,使得该函数变成内联函数 (1) 适用于函数体很小&#xff0c;调用很频繁的函数类型&#xff0c;可以引入内联函数 (2) inline影响编译器&#xff0c;在编译阶段对inc…

apache pdfbox_Apache PDFBox 2

apache pdfboxApache PDFBox 2已于今年早些时候发布 &#xff0c; Apache PDFBox 2.0.1和Apache PDFBox 2.0.2已发布。 Apache PDFBox是开源的&#xff08; Apache许可证版本2 &#xff09;并且基于Java&#xff08;因此易于使用&#xff0c;包括Java &#xff0c; Groovy &…

cad坐标归零lisp_CAD图怎么归零

展开全部原理&#xff0c;就是把图元Z轴线移动的负无穷远&#xff0c;然e68a84e8a2ad62616964757a686964616f31333335336530后移动到正无穷&#xff0c;除了块就可以Z轴线归零了。用autoLISP来解决。;;;;;;Z坐标归零;;(defun c:z0 ( / &kw &k1 #os1)(setvar "cmde…

dynamodb java_使用Java查询DynamoDB项

dynamodb java在上一篇文章中&#xff0c;我们继续在DynamoDB数据库上插入数据。 在本教程中&#xff0c;我们将对DynamoDB表发出一些基本查询。 主要规则是每个查询都必须使用哈希键。 查询的最简单形式是仅使用哈希键。 我们将在此表上查询Users表。 结果只有一个&#xff…