题目描述:

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 };

 

 

 

posted on 2018-03-01 23:28  宵夜在哪  阅读(81)  评论(0编辑  收藏  举报