您的位置:首页 > 其它

[LeetCode 题解]: Permutations II

2014-06-17 18:14 417 查看
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即可。

 class Solution {
public:
vector<vector<int> > vi;
vector<int> types;  // 数字缓存数组
vector<int> counts; // 数字计数器数组
vector<int> seq;    //  打印数组

void generatePermute(int len)
{
if(len==0)
{
vi.push_back(seq);
return;
}
for(int i=0;i<types.size();i++)
{
if((counts[i])>0)
{
counts[i]--;
seq[len-1]=types[i];    //第len-1 是否存放types[i]
generatePermute(len-1);
counts[i]++;
}
}
}

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

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

vi.clear();      //结果数组初始化
types.clear();   //数字缓存数组初始化
counts.clear();  //计数器初始化
seq.resize(num.size());  //输出数组大小设定

int j=0;
types.push_back(num[0]);
counts.push_back(1);

for(int i=1;i<num.size();i++)
{
if(num[i]==types.back())
{
counts.back()++;
}
else
{
types.push_back(num[i]);
counts.push_back(1);
}
}
generatePermute(num.size());
return vi;
}
};


转载请注明出处: http://www.cnblogs.com/double-win/ 谢谢!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: