You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求这段生成所有子集的C++代码的时间复杂度及空间复杂度验证

子集生成代码的复杂度分析

待分析代码

class Solution {
private:
    void solve(vector<int>& nums, int index, vector<vector<int>> &ans, vector<int> v) {
        if (index >= nums.size()) {
            ans.push_back(v);
            v.clear();
            return;
        }
        //exclude
        solve(nums, index + 1, ans, v);
        //include
        int val = nums[index];
        v.push_back(val);
        solve(nums, index + 1, ans, v);
    }

public:
    vector<vector<int>> subsets(vector<int>& nums) {
        int index = 0;
        vector<int> v;
        vector<vector<int>> ans;
        solve(nums, 0, ans, v);
        return ans;
    }
};

提问内容

我正在分析这段生成所有子集的C++代码的复杂度,我认为其空间复杂度为O(n),理由是函数调用栈的最大占用空间等于n,且每个函数仅复制数组指针,占用常数空间,但不清楚其时间复杂度,特此咨询。


时间复杂度分析

  • 对于包含n个元素的数组,总共有2ⁿ个子集,这是子集的总数。
  • 每个子集生成时都会执行ans.push_back(v)操作,该操作的时间开销为O(k)(k是当前子集的元素数量,因为需要复制v中的所有元素到ans)。
  • 计算所有子集的元素总数:每个元素会出现在2ⁿ⁻¹个子集中(每个元素有选/不选两种状态,剩余n-1个元素任意组合共2ⁿ⁻¹种),因此总元素数为n×2ⁿ⁻¹。
  • 综上,这段代码的时间复杂度为O(n×2ⁿ)。

空间复杂度确认

你对空间复杂度的分析是正确的:

  • 递归调用栈的最大深度为n(从index=0递归到index=n),栈空间占用O(n)。
  • 若不考虑存储结果的ans(输出空间),仅计算算法的额外空间,复杂度为O(n);若包含输出空间,总空间复杂度为O(n×2ⁿ),你的分析聚焦于调用栈和额外空间,结论准确。

内容的提问来源于stack exchange,提问作者Tanuj

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 11:06:13