[LeetCode] Permutations II

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], and [2,1,1].

先对数组进行排序,这样在DFS的时候,可以先判断前面的一个数是否和自己相等,相等的时候则前面的数必须使用了,自己才能使用,这样就不会产生重复的排列了。

 1 class Solution {
 2 private:
 3     bool canUse[100];
 4     int a[100];
 5     vector<vector<int> > ret;
 6 public:
 7     void dfs(int dep, int maxDep, vector<int> &num)
 8     {
 9         if (dep == maxDep)
10         {
11             vector<int> ans;
12             for(int i = 0; i < maxDep; i++)
13                 ans.push_back(a[i]);
14             ret.push_back(ans);
15             return;
16         }
17         
18         for(int i = 0; i < maxDep; i++)
19             if (canUse[i])
20             {
21                 if (i != 0 && num[i] == num[i-1] && canUse[i-1])
22                     continue;
23                     
24                 canUse[i] = false;
25                 a[dep] = num[i];
26                 dfs(dep + 1, maxDep, num);
27                 canUse[i] = true;
28             }
29     }
30     
31     vector<vector<int> > permuteUnique(vector<int> &num) {
32         // Start typing your C/C++ solution below
33         // DO NOT write int main() function
34         sort(num.begin(), num.end());
35         memset(canUse, true, sizeof(canUse));
36         ret.clear();
37         dfs(0, num.size(), num);
38         return ret;
39     }
40 };
posted @ 2012-11-13 21:22  chkkch  阅读(4190)  评论(0编辑  收藏  举报