leetcode Permutations II 无重全排列

作者:jostree  转载请注明出处 http://www.cnblogs.com/jostree/p/4051169.html

题目链接:leetcode Permutations II 无重全排列

题目要求对有重复的数组进行无重全排列。为了保证不重复,类似于全排列算法使用dfs,将第一个数字与后面第一次出现的数字交换即可。例如对于序列1,1,2,2

有如下过程:

1,1,2,2 -> 1,1,2,2 -> 1,1,2,2 -> 1,1,2,2

           -> 1,2,1,2 -> 1,2,1,2

                -> 1,2,2,1

    -> 2,1,1,2 -> 2,1,1,2 -> 2,1,1,2

                -> 2,1,2,1

           -> 2,2,1,1 -> 2,2,1,1

代码中使用set来记录数字是否在前面出现过,如果出现过,则不与第一个数字进行交换。

代码如下:

 1 class Solution {
 2 public:
 3 void swap(int &a, int &b)
 4 {
 5     int tmp = a;
 6     a = b;
 7     b = tmp;
 8 }
 9 void p(vector<int> &num, vector<vector<int> > &res, int begin) 
10 {
11     if( begin == num.size() )
12     {
13         vector<int> tmp;
14         for( int i = 0 ; i < num.size() ; i++ )
15         {
16             tmp.push_back(num[i]);
17         }
18         res.push_back(tmp);
19     }
20     else
21     {
22         set<int> used;
23         for( int i = begin ; i < num.size() ; i++ )
24         {
25             if(!used.count(num[i]))
26             {
27                 used.insert(num[i]);
28                 swap(num[i], num[begin]);
29                 p(num, res, begin+1);
30                 swap(num[i], num[begin]);
31             }
32         }
33     }
34 }
35 vector<vector<int> > permuteUnique(vector<int> &num) 
36 {
37     vector<vector<int> >res;
38     if( num.size() == 0 )
39     {
40         return res;
41     }
42     sort(num.begin(), num.end());
43     p(num, res, 0);
44     return res;
45 }
46 };
View Code

 

posted @ 2014-10-26 01:08  jostree  阅读(251)  评论(0编辑  收藏  举报