题目描述:
Given a collection of numbers that might contain duplicates, return all possible unique permutations.
For example,[1,1,2]
have the following unique permutations:
[ [1,1,2], [1,2,1], [2,1,1] ]
和上一题一样,也是要我们返回所有排列组合。不同的是:这次的元素有重复的。
解题思路:
思路和上一题是一样的,最主要的是如何避免重复:
首先把数组进行排序;
然后再交换元素时把重复的元素略去。
代码:
1 class Solution { 2 public: 3 void selectAll(vector<vector<int>>& ret, vector<int> cur, int& n, int index){ 4 if(index == n-1) 5 ret.push_back(cur); 6 for(int i = index; i < n; i++){ 7 if(i > index){ 8 if(cur[i] == cur[index]) 9 continue; 10 swap(cur[i],cur[index]); 11 } 12 selectAll(ret, cur, n, index+1); 13 } 14 } 15 vector<vector<int>> permuteUnique(vector<int>& nums) { 16 int n = nums.size(); 17 vector<vector<int>> ret; 18 if(n < 1) 19 return ret; 20 sort(nums.begin(), nums.end()); 21 selectAll(ret, nums, n, 0); 22 return ret; 23 } 24 };