網(wǎng)站備案后臺廣東疫情最新資訊
這道題與子集(力扣78)-CSDN博客?的區(qū)別就在于集合中的元素會重復(fù),那么還按照之前的代碼來操作就會得到重復(fù)的子集,因此這道題的重點就在于去重。需要注意的是,這里的去重指的是在同一層遞歸中,而在往下遞歸的子集中可以取重復(fù)的元素。那么具體是如何實現(xiàn)的呢?其實用到的方法還是之前組合總和II(力扣40)-CSDN博客?這道題使用過的套路。額外注意的是,我們一定要先記得將集合排序,再使用這種去重方法。大家可以結(jié)合我下面的代碼及詳細(xì)注釋理解此題。
代碼及詳細(xì)注釋如下:
class Solution {
public:vector<int> path;vector<vector<int>> result;void backtracking(vector<int>& nums,int start,vector<int>& used){result.push_back(path);if(start >= nums.size()){return;}for(int i = start;i < nums.size();i++){//去重操作if(i > 0 && nums[i] == nums[i - 1] && used[i - 1] == 0){continue;}path.push_back(nums[i]);used[i] = 1;backtracking(nums,i + 1,used);path.pop_back();used[i] = 0;}return;}vector<vector<int>> subsetsWithDup(vector<int>& nums) {path.clear();result.clear();sort(nums.begin(), nums.end()); // 去重需要排序vector<int> used(nums.size(),0);backtracking(nums,0,used);return result;}
};