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], [3,2,1] ]思路:递归。以中学时做排列组合时为例,手动模拟该过程就会得到思路。首先选择集合中的某一个元素作为第一位,接着在剩下的元素中选择一个元素作为第二位,一直到剩下的元素只有一个,一直到为空。
具体做法:上述过程显然是个递归的过程,声明帮助函数:permuteHelper(vector<vector<int> >& result, vector<int>& tmp, vector<int>& nums)。tmp用来存储已经选定的元素,nums用来存储剩下的元素,result存储所得的情况。显然当nums为空的时候递归应该返回。
注意:关键在于对nums和tmp的处理,一旦tmp中增加了一个元素,nums就要删除该元素;每次有一个帮助函数返回时都会进行一次回溯,即nums要插入元素,tmp要删除元素。
代码1:
class Solution {
public:
vector<vector<int> > permute(vector<int> &num) {
vector<vector<int> > result;
permuteRecursive(num, 0, result);
return result;
}
// permute num[begin..end]
// invariant: num[0..begin-1] have been fixed/permuted
void permuteRecursive(vector<int> &num, int begin, vector<vector<int> > &result) {
if (begin >= num.size()) {
// one permutation instance
result.push_back(num);
return;
}
for (int i = begin; i < num.size(); i++) {
swap(num[begin], num[i]);
permuteRecursive(num, begin + 1, result);
// reset
swap(num[begin], num[i]);
}
}
};
代码3:
class Solution {
public:
vector<vector<int> > permute(vector<int>& nums) {
vector<int> tmp;
vector<vector<int> > result;
permuteHelper(result, tmp, nums);
return result;
}
void permuteHelper(vector<vector<int> >& result, vector<int>& tmp, vector<int>& nums)
{
if(nums.empty())
{
result.push_back(tmp);
return;
}
for(int i = 0; i < nums.size(); i++)
{
int n = nums[i];
tmp.push_back(n);
nums.erase(nums.begin()+i);
permuteHelper(result, tmp, nums);
nums.insert(nums.begin()+i, n);
tmp.pop_back();
}
}
};