方法一:
class Solution {
public:
vector<vector<int>> permute(vector<int>& nums) {
vector<vector<int>> res;
back_trace(res,nums,0);
return res;
}
void back_trace(vector<vector<int>> &res,vector<int> nums,int i) # nums 不是引用
{
if(i == nums.size() -1)
{
res.push_back(nums);
return ;
}
for(int j = i;j<nums.size();j++)
{
swap(nums[i],nums[j]);
back_trace(res,nums,i+1);
}
}
};
方法二:回溯
#include <iostream>
#include <string>
#include<vector>
#include<algorithm>
using namespace std;
void swap(int &i, int &j)
{
int c=i;
i= j;
j=c;
}
void coutAll(vector<int> vec, int cur, int len)
{
if (cur == len)
{
for (int i = 0;i<len;i++)
cout<<vec[i]<<" ";
cout<<endl;
}
else
{
for (int i = cur;i<len;i++)
{
bool isskip=false; //判断当前的数字在后面是否出现过,如果出现过就跳过,不进行swap
for (int j = i+1;j<len;j++)
{
if (vec[i] == vec[j])
{
isskip=true;
break;
}
}
if (isskip)
{
continue;
}
else
{
swap(vec[cur], vec[i]);
coutAll(vec, cur+1, len);
swap(vec[cur], vec[i]);
}
}
}
}
int main() {
vector<int> a;
a.push_back(1);
a.push_back(2);
a.push_back(1);
//a.push_back(2);
coutAll(a, 0, a.size());
return 0;
}