这个算法做的事情很基础,就是穷举。解决一个回溯问题,实际上就是解决一个决策树的问题。
reslut = []; def backtrack(路径, 选择列表){ if 满足结束条件 result.add(路径) return for 选择 in 选择列表 做选择 backtrack(路径,选择列表) 撤销选择 其核心就是for循环里面的递归,在递归之前“做选择”,在递归之后“撤销选择”。
123全排列问题:
#include<iostream> #include<vector> #include<map> using namespace std; class Solution { public: vector<vector<int>> result; vector<vector<int>> permute(vector<int>& nums) { vector<bool> select(nums.size(),false); vector<int> path; trackback(select,path,nums); return result; } void trackback(vector<bool> select,vector<int> path,vector<int>& nums) { if(nums.size()==path.size()) { result.emplace_back(path); // emplace_back 比 push_back效率更高 return; } for(int i=0;i<nums.size();i++) { if(select[i]) continue; path.emplace_back(nums[i]); select[i]=true; trackback(select,path,nums); select[i]=false; path.pop_back(); } } };