1、46. 全排列
给定一个 没有重复 数字的序列,返回其所有可能的全排列。
示例:
输入: [1,2,3]
输出:
[
[1,2,3],
[1,3,2],
[2,1,3],
[2,3,1],
[3,1,2],
[3,2,1]
]
代码:
class Solution {
public:
int sz;
vector<int> mark;
vector<vector<int>> res;
void backtrace(vector<int>& nums, int start, vector<int> tmp)
{
if(start>=sz)
{
res.push_back(tmp);
return ;
}
for(int i=0;i<sz;i++)
{
if(mark[i]==0)
{
mark[i]=1;
tmp.push_back(nums[i]);
backtrace(nums,start+1,tmp);
tmp.pop_back();
mark[i]=0;
}
}
}
vector<vector<int>> permute(vector<int>& nums) {
sz=nums.size();
mark.resize(sz,0);
vector<int> tmp;
backtrace(nums,0,tmp);
return res;
}
};
2、47. 全排列 II
给定一个可包含重复数字的序列,返回所有不重复的全排列。
示例:
输入: [1,1,2]
输出:
[
[1,1,2],
[1,2,1],
[2,1,1]
]
class Solution {
public:
int n;
vector<vector<int>> res;
vector<int> mark;
void backtrace(vector<int>& nums, int start, vector<int> tmp )
{
if(start>=n)
{
res.push_back(tmp);
return ;
}
for(int i=0;i<n;i++)
{
if(mark[i]==0)
{
if( i>0 && nums[i]==nums[i-1] && mark[i-1]==0 ) //关键点要求mark[i-1]==0,即新一轮的排列
continue;
mark[i]=1;
tmp.push_back(nums[i]);
backtrace( nums, start+1, tmp);
tmp.pop_back();
mark[i]=0;
}
}
}
vector<vector<int>> permuteUnique(vector<int>& nums) {
sort(nums.begin(),nums.end());
n=nums.size();
mark.resize(n);
vector<int> tmp;
backtrace(nums, 0, tmp);
return res;
}
};