Loading

【力扣】子集II(回溯法)(排序函数的一种隐藏用法?)

题目描述

image
可以套回溯模版的题,但是在写的过程中发现,如果数组中有多个相同元素分散存在的话,就会有一些子集无法得到
image
像这里的1,4,4,如果对数组从左到右枚举的话是无论如何都得不到的。
对这样的数组使用排序函数后,造成的效果就是相同的元素都堆在了一起,这样就能正确地得到所有子集。

class Solution {
public:
vector<vector<int>> res;
vector<int> path;
bool occured(vector<int>& nums, int key, int startindex){
    for(int i = startindex; i < key; i++){
        if(nums[key] == nums[i]){
            return true;
        }
    }
    return false;
}
void backtrace(vector<int>& nums, int startindex,int length){
    if(path.size() == length){
        res.push_back(path);
    }
    if(length > nums.size()){
        return ;
    }

    for(int i = startindex; i < nums.size(); i++){
        if(i != startindex && occured(nums, i,startindex)){
            continue;
        }else{
            path.push_back(nums[i]);
            backtrace(nums, i + 1, length + 1);
            path.pop_back();
        }
    }
}
    vector<vector<int>> subsetsWithDup(vector<int>& nums) {
        res.clear();
        sort(nums.begin(), nums.end());
        backtrace(nums, 0, 0);
        return res;
    }
};
posted @ 2024-03-09 15:08  SaTsuki26681534  阅读(20)  评论(0)    收藏  举报