算法思想:
比如对于n个不同的数,首先将第一个数与后面的n-1个数依次交换,就能得到n个不同的组合(包括不交换那一个),然后再将得到的n个不同的组合的第一个数固定,分别将其第2个数与余下的n-2个数,总共得到n*(n-1)个组合,依次类推,得到n!个组合。
class Solution {
public:
vector<vector<int>> res;
void swap(int i, int j, vector<int> &nums)
{
int tmp = nums[i];
nums[i] = nums[j];
nums[j] = tmp;
}
void Perm(int begin, int end, vector<int> &nums)
{
if (begin == end)
{
res.push_back(nums);
}
else
{
for (int i = begin; i <= end; i++)
{
swap(begin, i, nums);
Perm(begin+1, end, nums);
swap(begin, i, nums);
}
}
}
vector<vector<int>> permute(vector<int>& nums) {
int end = nums.size()-1;
Perm(0, end, nums);
return res;
}
};
利用标准库函数next_permutation()
class Solution {
public:
vector<vector<int>> permute(vector<int>& nums) {
int size = nums.size();
vector<vector<int>> res;
if (size == 0) return res;
sort(nums.begin(), nums.end());
do{
vector<int> tmp;
for (auto i : nums)
{
tmp.push_back(i);
}
res.push_back(tmp);
}while(next_permutation(nums.begin(), nums.end()));
return res;
}
};