Given a list of numbers with duplicate number in it. Find all unique permutations.
Example
For numbers [1,2,2]
the unique permutations are:
[
[1,2,2],
[2,1,2],
[2,2,1]
]
class Solution {
public:
/**
* @param nums: A list of integers.
* @return: A list of unique permutations.
*/
vector<vector<int> > permuteUnique(vector<int> &nums) {
// write your code here
vector<vector<int>> res;
if (nums.size() == 0) {
return res;
}
unordered_set<string> set;
queue<pair<vector<int>, pair<vector<int>, string>>> que;
for (int i = 0; i < nums.size(); i++) {
int a = nums[i];
string s;
stringstream ss;
ss << a;
ss >> s;
if (set.find(s) == set.end()) {
set.insert(s);
nums.erase(nums.begin() + i);
pair<vector<int>, string> p = make_pair(nums, s);
vector<int> temp = {a};
que.push(make_pair(temp, p));
nums.insert(nums.begin() + i, a);
}
}
while (!que.empty()) {
vector<int> target = que.front().first;
vector<int> rest = que.front().second.first;
string s_target = que.front().second.second;
que.pop();
if (target.size() == nums.size()) {
res.push_back(target);
continue;
}
int len = rest.size();
for (int i = 0; i < len; i++) {
int a = rest[i];
string s;
stringstream ss;
ss << a;
ss >> s;
if (set.find(s_target + "_" + s) == set.end()) {
set.insert(s_target + "_" + s);
target.push_back(a);
rest.erase(rest.begin() + i);
pair<vector<int>, string> p = make_pair(rest, s_target + "_" + s);
que.push(make_pair(target, p));
target.erase(target.begin() + target.size() - 1);
rest.insert(rest.begin() + i, a);
}
}
}
return res;
}
};