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]
]
题目链接:https://leetcode-cn.com/problems/permutations-ii/
思路
法一:回溯法
本题和上题相比,在有数组中有重复值的情况下,需要将排列相同的结果去重。
这里可以利用逻辑判断,对同层里遇到重复的元素时进行剪枝。
class Solution {
public:
vector<vector<int>> permuteUnique(vector<int>& nums) {
vector<vector<int>> res;
if(nums.size()<=0) return res;
bool visit[nums.size()] = {false};
return trace(nums, visit);
}
vector<vector<int>> trace(vector<int> nums, bool visit[]){
vector<vector<int>> res;
unordered_set<int> tmp;
for (int i = 0; i<nums.size(); ++i){
if(!visit[i] && tmp.find(nums[i])==tmp.end()){
tmp.insert(nums[i]);
visit[i] = true;
auto vec = trace(nums, visit);
visit[i] = false;
if(vec.size()<=0){
vector<int> tmp = {nums[i]};
res.push_back(tmp);
}else{
for(int j = 0; j<vec.size(); ++j){
vec[j].push_back(nums[i]);
}
res.insert(res.end(), vec.begin(), vec.end());
}
}
}
return res;
}
};