Given a collection of numbers that might contain duplicates, return all possible unique permutations.__
思路:和leet code 46 类似,最后用set去个重即可。。
1/* ***********************************************
2Author :111qqz
3Created Time :2017年04月13日 星期四 15时00分48秒
4File Name :47.cpp
5************************************************ */
6class Solution {
7
8public:
9 void solve( vector<int>&nums)
10 {
11 int n = nums.size();
12 if (n==0) return;
13 int k = -1;
14 for ( int i = n-2 ; i >= 0 ; i--)
15 {
16 if (nums[i]<nums[i+1])
17 {
18 k = i;
19 break;
20 }
21 }
22 if (k==-1)
23 {
24 reverse(nums.begin(),nums.end());
25 return;
26 }
27 int l = -1;
28 for ( int i = n-1 ; i >k ; i--)
29 {
30 if (nums[k]<nums[i])
31 {
32 l = i;
33 break;
34 }
35 }
36 swap(nums[l],nums[k]);
37 reverse(nums.begin()+k+1,nums.end());
38 }
39
40 void pr (vector<int> &nums)
41 {
42 int siz = nums.size();
43 for ( int i = 0 ; i < siz; i++)
44 printf("%d%c",nums[i],i==siz-1?'\n':' ');
45 }
46 vector<vector<int>> permuteUnique(vector<int>& nums) {
47 set<vector<int> >se;
48 vector<vector<int> >res;
49 int n = nums.size();
50 int total = 1 ;
51 for ( int i = 2 ; i <= n ; i++) total*=i;
52
53 for ( int i = 1 ; i <= total ; i++)
54 {
55 se.insert(nums);
56// pr(nums);
57 solve(nums);
58 }
59 for ( auto &it :se)
60 {
61 res.push_back(it);
62 }
63 return res;
64 }
65
66};