LeetCode 78

https://leetcode.cn/problems/subsets/description/

难度:中等

子集型回溯,选或不选。

时间复杂度:\(O(n2^n)\),其中 n 为 nums 的长度。每次都是选或不选,递归次数为一个满二叉树的节点个数,那么一共会递归 \(O(2^n)\) 次(等比数列和),再算上加入答案时复制 path 需要 O(n) 的时间,所以时间复杂度为 \(O(n2^n)\)。

空间复杂度:O(n)。返回值的空间不计。

class Solution {
public:
    vector<vector<int>> subsets(vector<int>& nums) {
        vector<vector<int>> ans;
        vector<int> path;
        int n = nums.size();
        auto dfs = [&](auto &&dfs, int i) {
            if (i == n) {
                ans.emplace_back(path);
                return;
            }
            dfs(dfs, i + 1);
            path.push_back(nums[i]);
            dfs(dfs, i + 1);
            path.pop_back();
        };
        dfs(dfs, 0);
        return ans;
    }
};