您的位置:首页 > 其它

leetcode之Permutations II

2014-05-08 21:32 246 查看
原题如下:

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]
.
之前的Permutations是没有重复元素的情况,当时只需用map记录当前元素是否用过然后深度遍历即可,而在这道题中,因为有重复元素,所以涉及去重问题,在前缀相同的情况下,不允许一个位置出现重复的元素(即仅出现一次即可),这与之前的从数列中寻找满足给定和的序列的题目相似但不相同leetcode之Combination
Sum && Combination Sum II,要注意区分去重的时机和方法,我对比看了下都有点儿晕了。。。

class Solution {
public:
vector<vector<int> > permuteUnique(vector<int> &num) {
sort(num.begin(),num.end());
vector<vector<int>>vv;
vector<int>v;
map<int,int>mp;
for(int i = 0; i < num.size(); i++){
if(mp.find(num[i]) != mp.end())
mp[num[i]]++;
else
mp[num[i]] = 1;
}
permute(vv,v,num,mp);
return vv;

}
void permute(vector<vector<int>>&vv,vector<int>v,vector<int>num,map<int,int>mp){
if(v.size() == num.size()){
vv.push_back(v);
return ;
}
for(int i = 0; i < num.size(); i++){
while(i > 0 && i < num.size() && num[i] == num[i - 1])
i++;
if(i == num.size()) //后边的数全一样,提前结束遍历
return;
if(mp[num[i]] > 0)
{
mp[num[i]]--;
v.push_back(num[i]);
permute(vv,v,num,mp);
v.pop_back();
mp[num[i]]++;
}
}
}
};


因为昨天下午做的求特定和的序列问题,今上午刚好又看了下没有重复元素的情况下的全排列问题,所以这道题是自己码出来的,但AC后对这道题理解的才更加透彻了些,在涉及重复元素问题时首先进行排序貌似是很有好处的。。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: