Given a collection of numbers that might contain duplicates, return all possible unique permutations.
Example:
Input: [1,1,2]
Output:
[
[1,1,2],
[1,2,1],
[2,1,1]
]
解法一:
class Solution {
public:
vector<vector<int>> permuteUnique(vector<int>& nums) {
int n = nums.size();
vector<vector<int> > result;
vector<int> path; // 临时保存当前的排列元素
vector<bool> visited(n, false); // 标记当前元素是否已经在临时排列中
sort(nums.begin(), nums.end());
permuteUnique(nums, 0, result, path, visited);
return result;
}
void permuteUnique(vector<int>& nums, int start, vector<vector<int> >& result, vector<int>& path, vector<bool>& visited) {
if(start == nums.size()) {
result.push_back(path);
return;
}
for(int i = 0; i < nums.size(); i++) {
if(visited[i]) continue;
if(i > 0 && nums[i] == nums[i - 1] && visited[i -1] == false) continue;
path.push_back(nums[i]);
visited[i] = true;
permuteUnique(nums, start + 1, result, path, visited);
path.pop_back();
visited[i] = false;
}
}
};
解法二:
待补充,
大体思想:利用map统计出每个元素出现的次数。
参考资料: