回溯基础

先看一个使用回溯方法求集合子集的例子(78. Subsets),以下代码基本说明了回溯使用的基本框架:

//78. Subsets
class Solution {
private:
void backtrack(vector<vector<int>>& res,vector<int>& tmp,vector<int>& nums,int start){
res.push_back(tmp); //满足一定条件下将当前数据加入结果集
for(int i=start;i<nums.size();i++){
tmp.push_back(nums[i]); //选择一条路径
backtrack(res,tmp,nums,i+); //DFS朝当前路径行进
tmp.pop_back(); //回退路径
}
}
public:
vector<vector<int>> subsets(vector<int>& nums) {
vector<vector<int>> res;
vector<int> tmp;
backtrack(res,tmp,nums,);
return res;
}
};

即回溯方法主要有以下四个步骤

. 满足一定条件下将当前数据加入结果集
(或检查到不满足要求当即返回)
. 选择一条路径
. DFS向前进行
. 回退路径

一些情况下需要对数据进行预先处理,或在第2步直接检查以决定是否抛弃当前路径,以避免过多地递归、带来时间损耗。换而言之,不满足条件的路径越早抛弃越好。

理解回溯

回溯方法用到递归,涉及到递归让我们理解起来就不那么直观。下图直观展示了以上Subsets求解代码的执行过程,第5步开始出现路径回退:

可以把回溯的执行理解为一颗树从根到叶、从左到右的展开过程。图片来源 这里

回溯时间复杂度

同样因为用到递归,时间复杂度亦不能够直观地计算,以上Subsets问题比较容易地能看出来为O(2^n)。如果对递归过程计算时间复杂度,详见 这里

相关LeetCode题:

78. Subsets  题解

90. Subsets II  题解

46. Permutations  题解

79. Word Search  题解

40. Combination Sum II  题解

51. N-Queens  题解  可视化

最新文章

  1. 良心版Dolby Home Theater v4.1安装教程
  2. iOS On-Demand Resources简单理解
  3. OpenGL显示图片
  4. 使用Struts 2框架实现文件下载
  5. Find a way——L
  6. This tag and its children can be replaced by one &lt;TextView/&gt; and a compound drawable
  7. js练习-控制div属性
  8. 菜鸟的MySQL学习笔记(三)
  9. MVC4 成员资格、 身份验证
  10. Arpa&#39;s weak amphitheater and Mehrdad&#39;s valuable Hoses
  11. zookeeer client 通信协议
  12. 项目实战——企业级Zabbix监控实战(一)
  13. Linux 安装多个版本JDK并设置默认版本
  14. HC-06蓝牙模块的使用
  15. swap
  16. 解决ios兼容性问题
  17. android handlerThread
  18. webpack插件配置(一) webpack-dev-server 路径配置
  19. SQL Server的优点与缺点
  20. django-suit的使用

热门文章

  1. luoguP2502旅行
  2. C# 高级编程03----细节内容
  3. 总结web自动化测试页面常用字段的定位方法
  4. Redis在Linux中安装使用
  5. 最长共公子序列(LCS)
  6. vmware 虚拟机报错 删除文件夹,可以恢复
  7. mysql按天,小时,半小时,N分钟,分钟进行数据分组统计
  8. 同时安装多个的Mysql的实现方法
  9. 使用 Vscode +PlantUml 画uml图
  10. Win7共享文件夹简单?这个共享问题可以难倒90%的人