原題如下:
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]
.
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後對這道題理解的才更加透徹了些,在涉及重複元素問題時首先進行排序貌似是很有好處的。。。