一.问题描述
Given a collection of distinct numbers, return all possible permutations.
For example,
[1,2,3] have the following permutations:
[1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], and [3,2,1].
二.我的解题思路
这道题目比较简单,直接使用回溯法就可以解决,解空间是排列树。测试通过的程序如下:
class Solution {
public:
vector<vector<int>> permute(vector<int>& nums) {
vector<vector<int>> res;
int len = nums.size();
if(len<2){ res.push_back(nums);return res;}
for(int i=0;i<len;i++){
vector<int> curr;
swap(nums[i],nums[0]);
curr.push_back(nums[0]);
back_trace(nums,curr,res,1);
curr.pop_back();
swap(nums[i],nums[0]);
}
return res;
}
void back_trace(vector<int>& nums,vector<int>& curr, vector<vector<int>>& res,int i){
int len = nums.size();
if(i>=len)
res.push_back(curr);
else{
for(int j=i;j<len;j++){
swap(nums[i],nums[j]);
curr.push_back(nums[i]);
back_trace(nums,curr,res,i+1);
curr.pop_back();
swap(nums[i],nums[j]);
}
}
}
void swap(int & a, int & b){
int tmp;
tmp = a;
a = b;
b = tmp;
}
};
对于排列树而言,要注意每次递归函数前后都有两个swap操作。而针对子集树的回溯法则没有