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],
[2,1,1]
]
这道题和46. Permutations唯一的区别是,这道题给出的数组可能有重复数字,因此要剔除答案中的重复元素。最简单的解决方法是用set来存储答案。
class Solution {
public:
vector<vector<int>> permuteUnique(vector<int>& nums) {
set<vector<int>> ans;
vector<int> out;
vector<int> visited(nums.size(), 0);
permuteUniqueDFS(ans, 0, nums, visited, out);
return vector<vector<int>>(ans.begin(), ans.end());
}
void permuteUniqueDFS(set<vector<int>>& ans, int level, vector<int>& nums, vector<int>& visited, vector<int>& out) {
if (level == nums.size()) ans.insert(out);
else {
for (int i = 0; i < nums.size(); i++) {
if (visited[i] == 0) {
out.push_back(nums[i]);
visited[i] = 1;
permuteUniqueDFS(ans, level + 1, nums, visited, out);
out.pop_back();
visited[i] = 0;
}
}
}
}
};