题目描述:
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]
.
2、后来换了个思路上更好理解的方法,用map记录下所有元素及每个元素出现的次数,依次将数组填满。
代码如下:
方法1:
vector<vector<int> > permuteUnique(vector<int> &num) {
vector<vector<int>> ret;
sort(num.begin(), num.end());
ret.push_back(num);
for (int i = 0; i < num.size(); i++){
int N = ret.size();
for (int j = 0; j < N; j++){
vector<int> tmp = ret[j];
for (int k = i + 1; k < tmp.size(); k++){
if (isdup(tmp, i, k))
continue;
swap(tmp[i], tmp[k]);
ret.push_back(tmp);
swap(tmp[i], tmp[k]);
}
}
}
return ret;
}
bool isdup(vector<int> &tmp, int i, int k){
for (int m = i; m < k;m++)
if (tmp[m] == tmp[k])
return true;
return false;
}
方法2:
vector<vector<int> > permuteUnique(vector<int> &num) {
unordered_map<int, int> count;
vector<vector<int>> ret;
for (int i = 0; i < num.size(); i++)
count[num[i]]++;
vector<int> path;
solve(count, path, num.size(), ret);
return ret;
}
void solve(unordered_map<int, int> &count, vector<int> &path, int N, vector<vector<int>> &ret){
if (path.size() == N){
ret.push_back(path);
return;
}
for (unordered_map<int, int>::iterator iter = count.begin(); iter != count.end(); iter++){
if (iter->second <= 0)
continue;
iter->second--;
path.push_back(iter->first);
solve(count, path, N, ret);
path.pop_back();
iter->second++;
}
}