Permutations(与顺序有关)
Perms(nums[0…n-1]) = {取出一个数字} + Perms( nums[{0…n-1} - 这个数字] )
搜索的元素之间,互相是冲突的,故状态也需要回溯
树形结构
可以看出一个元素若已使用,则在递归及循环的过程中就不能再使用,故定义一个used
数组。
回溯三步曲
- 返回值与参数
void generatePermutation(vector<int>& nums, int index, vector<int> &p)
- 终止条件
if(index == nums.size()){
res.push_back(p);
return;
}
- 搜索过程
for(int i = 0; i < nums.size(); i++){
if(!used[i]){
p.push_back(nums[i]);
used[i] = true;
generatePermutation(nums, index+1, p);
cout<<"return2"<<endl;
p.pop_back();
used[i] = false;
}
}
class Solution {
private:
//p中保存了一个有index个元素的排列
//向这个排列的末尾添加index+1个元素,获得一个有index+1个元素的排列
vector<vector<int>> res;
vector<bool> used;
void generatePermutation(vector<int>& nums, int index, vector<int> &p){
if(index == nums.size()){
res.push_back(p);
cout<<p[0]<<":"<<endl;
for(int i = 0; i < p.size(); i++)
cout<<p[i];
cout<<endl;
cout<<"return1"<<endl;
return;
}
for(int i = 0; i < nums.size(); i++){
if(!used[i]){
p.push_back(nums[i]);
used[i] = true;
generatePermutation(nums, index+1, p);
cout<<"return2"<<endl;
p.pop_back();
used[i] = false;
}
}
cout<<"complete: return3"<<endl;
return;
}
public:
vector<vector<int>> permute(vector<int>& nums){
if(nums.size() == 0){
return res;
}
vector<int> p;
used = vector<bool>(nums.size(), false);
generatePermutation(nums, 0, p);
return res;
}
};