回溯法(back tracking)
用回溯法解问题时,应明确定义问题的解空间。问题的解空间至少包含问题的一个(最优)解。
** 回溯算法框架**
void backtrack(路径,选择列表){
if(满足条件){
res.push_back(路径);
return;
}
for 选择 in 选择列表:
做选择
backtrack(路径, 选择列表)
撤销选择
}
void backtrack(路径,选择列表){
if(满足条件)
res.push_back(路径);
return;
class Solution {
public:
void backtrack(vector<string>& res, string s, int open, int close, int n){
//剪枝操作
if (open > n || close > n || open < close) return;
if (open == close && open == n){
res.push_back(s);
return ;
}
backtrack(res, s + '(', open + 1, close, n);
backtrack(res, s + ')', open, close + 1, n);
}
vector<string> generateParenthesis(int n) {
vector<string> res;
string s;
backtrack(res, s, 0, 0, n);
return res;
}
};
class Solution {
public:
vector<vector<int>> permute(vector<int>& nums) {
vector<vector<int>> res;
backtrace(nums.size(),nums,res,0);
return res;
}
void backtrace(int n , vector<int> &nums, vector<vector<int>> &res, int first){
if (first == n){
res.push_back(nums);
}
for (int i=first; i<n; i++){
swap(nums[first],nums[i]);
backtrace(n,nums,res,first+1);
swap(nums[first],nums[i]);
}
}
};