![在这里插入图片描述](https://img-blog.csdnimg.cn/20210311233424507.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1NMX1dvcmxk,size_16,color_FFFFFF,t_70)
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;
}
};
![在这里插入图片描述](https://img-blog.csdnimg.cn/2021031121444098.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1NMX1dvcmxk,size_16,color_FFFFFF,t_70)