Leetcode 47. 全排列 II
题目
给定一个可包含重复数字的序列,返回所有不重复的全排列。
测试样例
输入: [1,1,2]
输出:
[
[1,1,2],
[1,2,1],
[2,1,1]
]
题解
回溯算法。
为了避免重复,我们可以先对数组进行排序,我们选数时把重复的数略掉即可,方法见代码
代码
vector<vector<int>> ans;
void dfs(int begin,int n,vector<int>& num,vector<int>& nums,vector<int> &use){
if(begin == n){
ans.push_back(num);
}
if(begin<n){
for(int i=0; i<n; i++){
if(i>0 && use[i-1] && nums[i-1] == nums[i]) continue; //避免在同位置选取同一个数
if(!use[i]){
use[i]=1;
num.push_back(nums[i]);
dfs(begin+1,n,num,nums,use);
use[i]=0;
num.pop_back();
}
}
}
}
vector<vector<int>> permuteUnique(vector<int>& nums) {
sort(nums.begin(),nums.end());
int n=nums.size();
vector<int> use(n,0);
vector<int> num;
dfs(0,n,num,nums,use);
return ans;
}
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/permutations-ii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。