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]
]
题意:给出几个元素,生成这些元素的全排列。递归算法
//22 ms
class Solution {
public:
int vis[1000000];
vector<vector<int> > res;
void f(vector<int>& nums,vector<int>& tmp)
{
for(int i=0;i<nums.size();i++)
{
if(vis[i] == 0) //还没有放进去,压入 vector
{
tmp.push_back(nums[i]);
vis[i] = 1;
f(nums,tmp);
vis[i] = 0;
vector<int>::iterator it = tmp.end();
it--;
tmp.erase(it); //删除刚才放进去的元素
}
}
if(tmp.size() == nums.size()) //全部都放进去了
{
res.push_back(tmp);
return;
}
}
vector<vector<int>> permute(vector<int>& nums)
{
vector<int> tmp;
f(nums,tmp);
return res;
}
};
解法二:solution提供的解法,每次直接对现有数组交换顺序,不需要额外空间,代码量也更少
// 13 ms
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]);
}
}
};