File tree 1 file changed +49
-0
lines changed
solution/0047.Permutations II
1 file changed +49
-0
lines changed Original file line number Diff line number Diff line change
1
+ class Solution {
2
+ private:
3
+ void my_next_permutation (vector<int >::iterator b, vector<int >::iterator e)
4
+ {
5
+ // 指针从后往前移动找到第一个下降值, (如 1, 3, 2 的1为下降值)
6
+ // 在这个下降值(1)后面找一个比下降值大的最小值(2),与下降值(1)交换
7
+ // 交换后原来下降值之后的位置做排序(2, 1, 3)
8
+ vector<int >::iterator p = e-2 ;
9
+ while (p >= b && *p >= *(p+1 ))
10
+ --p ;
11
+
12
+ if (p >= b)
13
+ {
14
+ int M = *p ;
15
+ vector<int >::iterator pnindex = p ;
16
+ for (vector<int >::iterator pn = p+1 ; pn < e; ++pn)
17
+ if (*pn > *p)
18
+ {
19
+ M = min (M, *pn) ;
20
+ pnindex = pn ;
21
+ }
22
+ swap (*p, *pnindex) ;
23
+ sort (p+1 , e) ;
24
+ }
25
+ else
26
+ sort (b, e) ;
27
+ }
28
+ inline bool IsSample (vector<int > &a, vector<int > &b)
29
+ {
30
+ // 长度肯定一样,就不用比较长度了
31
+ for (int i = a.size ()-1 ; i >= 0 ; --i)
32
+ if (a[i] != b[i])
33
+ return false ;
34
+ return true ;
35
+ }
36
+ public:
37
+ vector<vector<int >> permuteUnique (vector<int >& nums) {
38
+ vector<int > nums_bak (nums) ;
39
+ vector<vector<int >> res ;
40
+
41
+ do
42
+ {
43
+ res.push_back (nums) ;
44
+ my_next_permutation (nums.begin (), nums.end ()) ;
45
+ } while ( !IsSample (nums, nums_bak) ) ;
46
+
47
+ return res ;
48
+ }
49
+ };
You can’t perform that action at this time.
0 commit comments