[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的思想。

首先需要遍历输入数组,获取一共有多少种不同的数字,每个数字有多少个。 最简单的方法,排序后统计。

然后就是对应位置填数字的游戏了,DFS即可。

 1 class Solution {  2 public:  3    vector<vector<int> > vi;  4     vector<int> types;  // 数字缓存数组

 5     vector<int> counts; // 数字计数器数组

 6     vector<int> seq;    // 打印数组

 7 

 8     void generatePermute(int len)  9  { 10         if(len==0) 11  { 12  vi.push_back(seq); 13             return; 14  } 15         for(int i=0;i<types.size();i++) 16  { 17             if((counts[i])>0) 18  { 19                 counts[i]--; 20                 seq[len-1]=types[i];    //第len-1 是否存放types[i]

21                 generatePermute(len-1); 22                 counts[i]++; 23  } 24  } 25  } 26 

27     vector< vector<int> > permuteUnique(vector<int> &num) { 28         

29         if(num.size()==0) return vi; 30  sort(num.begin(),num.end()); 31         

32         vi.clear();      //结果数组初始化

33         types.clear();   //数字缓存数组初始化

34         counts.clear();  //计数器初始化

35         seq.resize(num.size());  //输出数组大小设定

36 

37         int j=0; 38         types.push_back(num[0]); 39         counts.push_back(1); 40 

41         for(int i=1;i<num.size();i++) 42  { 43             if(num[i]==types.back()) 44  { 45                 counts.back()++; 46  } 47             else

48  { 49  types.push_back(num[i]); 50                 counts.push_back(1); 51  } 52  } 53  generatePermute(num.size()); 54         return vi; 55  } 56 };

转载请注明出处: http://www.cnblogs.com/double-win/ 谢谢!

你可能感兴趣的:(LeetCode)