回溯算法

戏子无情 提交于 2020-01-06 19:28:21

78.子集

基本思想:在每个子集中,nums中的每个元素都有“出现”和“不出现”两种可能,因此每个子集都可以表示为一棵二叉树中根节点到叶节点的路径。

方法一:DFS:搜索所有的从根节点到叶节点的路径即可得到所有子集。

方法二:回溯:搜索解空间并进行剪枝。

class Solution {
public:
    //1.dfs
    void dfs(vector<vector<int>>& res,vector<int>& nums,vector<int>& subset,int level){
        if(level==nums.size()){
            res.push_back(subset);
            return;
        }
        subset.push_back(nums[level]);
        dfs(res,nums,subset,level+1);
        subset.pop_back();
        dfs(res,nums,subset,level+1);
        return;
    }
    //2.回溯
    void backtracking(vector<vector<int>>& res,vector<int>& nums,vector<int>& subset,int level){
        if(level<=nums.size()){
            res.push_back(subset);
        }
        for(int i=level;i<nums.size();i++){
            subset.push_back(nums[i]);
            backtracking(res,nums,subset,i+1);
            subset.pop_back();
        }
        return;
    }
    vector<vector<int>> subsets(vector<int>& nums) {
        vector<vector<int>>res;
        vector<int>subset;
        //dfs(res,nums,subset,0);
        backtracking(res,nums,subset,0);
        return res;
    }
};

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!