leetcode 46. 全排列 及 47. 全排列 II
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:
vector<vector<int>> permute(vector<int>& nums) {
int n = nums.size();
vector<vector<int>> ans;
vector<int> path;
vector<bool> flag(n,false);
backtrack(ans,path,nums,n,0,flag);
return ans;
}
void backtrack(vector<vector<int>> &ans,vector<int> &path,vector<int>& nums,int n,int fir,vector<bool> &flag)
{
if(fir == n)
{
ans.push_back(path);
return;
}
for(int i = 0; i < n; i++)
{
if(!flag[i])
{
path.push_back(nums[i]);
flag[i] = true;
backtrack(ans,path,nums,n,fir+1,flag);
path.pop_back();
flag[i] = false;
}
}
}
};
结果:
执行用时 :12 ms, 在所有 cpp 提交中击败了95.23%的用户
内存消耗 :9.3 MB, 在所有 cpp 提交中击败了63.04%的用户
47. 全排列 II
问题描述
给定一个可包含重复数字的序列,返回所有不重复的全排列。
示例:
输入: [1,1,2]
输出:
[
[1,1,2],
[1,2,1],
[2,1,1]
]
问题分析
代码
class Solution {
public:
vector<vector<int>> permuteUnique(vector<int>& nums) {
int n = nums.size();
vector<vector<int>> ans;
vector<int> path;
vector<bool> flag(n,0);
sort(nums.begin(),nums.end());
backtrack(nums,flag,n,0,ans,path);
return ans;
}
void backtrack(vector<int>& nums,vector<bool> &flag,int n,int fir,vector<vector<int>>&ans,vector<int> &path)
{
if(fir == n){
ans.push_back(path);
return;
}
for(int i = 0; i < n; i++)
{
if(flag[i] == 0){
if(i > 0 && nums[i] == nums[i-1] && flag[i-1] == 1)continue;
path.push_back(nums[i]);
flag[i] = 1;
backtrack(nums,flag,n,fir+1,ans,path);
path.pop_back();
flag[i] = 0;
}
}
}
};
结果
执行用时 :16 ms, 在所有 C++ 提交中击败了79.11%的用户
内存消耗 :10.1 MB, 在所有 C++ 提交中击败了62.00%的用户