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

 

你可能感兴趣的:(LeetCode)