回溯:子集问题

leect 78 子集

代码

//自己的弱鸡代码
class Solution {
private:
    vector<vector<int>> result;
    vector<int> ans;
    void backtracking(int num, int h, vector<int>& nums, int startIndex) {
        if (num == ans.size()) {
            result.push_back(ans);
            return;
        }
        for (int i = startIndex; i < nums.size(); i++) {
                ans.push_back(nums[i]);
                backtracking(num, h + 1, nums, i + 1);
                ans.pop_back();
        }
    }
public:
    vector<vector<int>> subsets(vector<int>& nums) {
        result.push_back(ans);
        for (int i = 1; i <= nums.size(); i++) { // 真的搞笑,时间复杂度大大增加,虽然和官方输出一样,但是。。纯纯弱鸡
        backtracking(i, 0, nums, 0);
        }
        return result;
    }
};

coding in 代码随想录

class Solution {
private:
    vector<vector<int>> result;
    vector<int> path;
    void backtracking(vector<int>& nums, int startIndex) {
        result.push_back(path); // 收集子集,要放在终止添加的上面,否则会漏掉自己
        if (startIndex >= nums.size()) { // 终止条件可以不加
            return;
        }
        for (int i = startIndex; i < nums.size(); i++) {
            path.push_back(nums[i]);
            backtracking(nums, i + 1);
            path.pop_back();
        }
    }
public:
    vector<vector<int>> subsets(vector<int>& nums) {
        result.clear();
        path.clear();
        backtracking(nums, 0);
        return result;
    }
};

心得

做了很多回溯,大概能独立解决问题了,以前回溯是一块心病,但是还是弱鸡

如这道题,子集为空,1,2, ....size()

自己想的是用for来控制个数,但是没曾想,回溯个数每次都在变

posted @ 2023-03-13 09:36  壹剑霜寒十四州  阅读(12)  评论(0编辑  收藏  举报