一、采用集合(set),不能用unordered_set,因为unordered_set底层采用哈希表实现,哈希表无法将vector<int>作为键值。
class Solution {
public:
set<vector<int>> result;
vector<int> path;
void doBack(vector<int>& nums, int start){
// if(start > 0 && start < nums.size() && nums[start] == nums[start - 1]) return;
result.insert(path);
if(nums.size() == start) return;
for(int i = start; i < nums.size(); i++){
path.push_back(nums[i]);
doBack(nums, i + 1);
path.pop_back();
}
}
vector<vector<int>> subsetsWithDup(vector<int>& nums) {
sort(nums.begin(), nums.end());
doBack(nums, 0);
return vector<vector<int>>(result.begin(), result.end());
}
};
二、正常回溯
class Solution {
public:
vector<vector<int>> result;
vector<int> path;
void doBack(vector<int>& nums, int start){
result.push_back(path);
if(nums.size() == start) return;
for(int i = start; i < nums.size(); i++){
if(i > start && nums[i] == nums[i - 1]) continue;
path.push_back(nums[i]);
doBack(nums, i + 1);
path.pop_back();
}
}
vector<vector<int>> subsetsWithDup(vector<int>& nums) {
sort(nums.begin(), nums.end());
doBack(nums, 0);
return result;
}
};