前言
回溯的最经典的题目。全排列在算法库也是有库函数文件的。
题目链接
一、非递减的子序列
vector<vector<int>> res;
vector<int>path;
void backtracking(vector<int>&nums,int startIndex){
if(path.size()>1)res.push_back(path);
unordered_set<int> uset;
for(int i=startIndex;i<nums.size();i++){
if((!path.empty()&&nums[i]<path.back())\
||uset.find(nums[i])!=uset.end()){
continue;
}
uset.insert(nums[i]);
path.push_back(nums[i]);
backtracking(nums,i+1);
path.pop_back();
}
}
vector<vector<int>> findSubsequences(vector<int>& nums) {
backtracking(nums,0);
return res;
}
二、全排列1
思路:
vector<vector<int>> permute(vector<int>& nums) {
backtracking(nums,0);
return res;
}
vector<vector<int>> res;
void backtracking(vector<int>nums,int x){
if(x==nums.size()-1){
res.push_back(nums);
return ;
}
for(int i=x;i<nums.size();i++){
swap(nums[i],nums[x]);
backtracking(nums,x+1);
swap(nums[i],nums[x]);
}
}