题目描述
给定一个可包含重复数字的序列,返回所有不重复的全排列。
示例:
输入: [1,1,2]
输出:
[
[1,1,2],
[1,2,1],
[2,1,1]
]
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/permutations-ii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解法1:回溯+剪枝
与45题相似,多了一个不能出现重复数组,也就是循环的时候进行判断是否与上一个数字相等,如果相等直接进行剪枝也就是进入下一循环
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
| class Solution { public: vector<vector<int>> permuteUnique(vector<int>& nums) { sort(nums.begin(),nums.end()); int n=nums.size(); int count=0; bool *used=new bool [n](); findall(nums,used,count,n); return res; } void findall(vector<int>& nums,bool *used,int count,int n) { if(count==n) { res.push_back(pre); return ; } int i; for(i=0;i<n;i++) { if(!used[i]) { if(i>0&&nums[i]==nums[i-1]&&(used[i-1]==false)) continue; used[i]=true; pre.push_back(nums[i]); findall(nums,used,count+1,n); pre.pop_back(); used[i]=false; } } return ; } private: vector<vector<int>> res; vector<int> pre; };
|