Leetcode90 c++sort函数+set容器+递归回溯法

给定一个可能包含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。

说明:解集不能包含重复的子集。

'''
class Solution {

public:

vector<vector<int>> subsetsWithDup(vector<int>& nums) {

    vector<vector<int>> a;

    vector<int> tmp;

    sort(nums.begin(),nums.end());

    push_it(a,0,tmp,nums);

    tmp.clear();

    set<vector<int>> b;

    for(int i=0;i<a.size();i++){

        b.insert(a[i]);

    }

    a.clear();

    for(set<vector<int>>::iterator it=b.begin();it!=b.end();it++){

        a.push_back(*it);

    }

    return a;

}

private:

void push_it(vector<vector<int>> &a,int pos, vector<int> tmp,vector<int>& nums){

    a.push_back(tmp);

    for(int i=pos;i<nums.size();i++){

        tmp.push_back(nums[i]);

        push_it(a,i+1,tmp,nums);

        tmp.pop_back();

    }

    return ;

}

};

'''

其中回溯代码部分解释:

'''
void push_it(vector<vector<int>> &a,int pos, vector<int> tmp,vector<int>& nums){

    a.push_back(tmp);

    for(int i=pos;i<nums.size();i++){

        tmp.push_back(nums[i]);

        push_it(a,i+1,tmp,nums);

        tmp.pop_back();

    }

    return ;

}

'''
该部分最好背下来,四个变量:a为主函数所求的返回值、pos标记每次的起始位置,tmp为临时变量值,nums为题目所给数组。
每次进递归时先把上一个tmp的变量push到a容器中,当循环到nums的队尾后pop出来(也便是回溯的思想)。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容