1 回溯法 (排序+first索引+跳过重复元素)
class Solution {
private:
int size;
vector<vector<int>> solution;
vector<int> path;
public:
void backtrack(vector<int>& nums, int first) {
solution.emplace_back(path);
for (int i = first; i < size; i++) {
if (i > first && nums[i] == nums[i-1]) continue;
path.emplace_back(nums[i]);
backtrack(nums, i + 1);
path.pop_back();
}
}
vector<vector<int>> subsetsWithDup(vector<int>& nums) {
size = nums.size();
sort(nums.begin(), nums.end());
backtrack(nums, 0);
return solution;
}
};