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

递归组合问题的时间与空间复杂度分析及解法咨询

组合问题代码的复杂度分析

时间复杂度:远高于O(a.length)

你的代码时间复杂度绝对不是O(a.length),具体拆解:

  1. 核心逻辑是生成数组a中所有长度为2的递增索引组合,本质是从n(a.length)个元素里选2个的组合数,即C(n,2) = n*(n-1)/2,这部分的递归+遍历次数已经是O(n²)级别。
  2. 额外拖慢速度的是result.includes(curr)这一步:每次检查都要遍历整个result数组,而result的长度就是C(n,2),这直接把时间复杂度拉到了O(n⁴)——完全没必要,因为你递归时是从i+1开始下一层循环,生成的curr索引必然是递增的,既不会重复,也满足curr[0] < curr[1],这两行判断可以直接删掉。

空间复杂度:无法简化为O(result.length)

空间复杂度由三部分组成,不能只算result的空间:

  1. 递归调用栈:递归深度是固定的k值(这里k=2),栈空间是O(k),这是必须的额外开销。
  2. 临时数组curr:虽然是复用的,但它的最大长度是k,这部分也是O(k)的固定空间。
  3. 结果数组result:存储所有组合,空间是O(C(n,k)*k)——每个组合有k个元素,共C(n,k)个组合,当k=2时就是O(n²)。
    如果不需要返回所有组合,只是计数,那可以不用存result,直接在终止条件时计数,这样空间复杂度能降到O(k),但如果必须返回组合,result的空间是躲不开的。

组合类问题的通用复杂度分析方法

时间复杂度怎么算

  • 先抓核心:组合问题的基础时间量级由**组合数C(n,k)**决定,因为至少要生成这么多结果,这是下限。
  • 再看额外操作:比如去重、排序、数组检查这类操作,会在基础量级上乘以额外的系数,像你代码里的includes就把复杂度从O(n²)升到了O(n⁴)。
  • 递归/迭代的总次数:递归树的总节点数是C(n,0)+C(n,1)+...+C(n,k),但核心有效操作是生成C(n,k)个结果,所以最终时间复杂度要看核心操作加额外操作的总和。

空间复杂度怎么算

  • 递归实现:重点看递归栈深度,等于k(每次选一个元素,选k次才触发终止条件),所以栈空间是O(k)。
  • 结果存储:如果要返回所有组合,空间就是O(C(n,k)*k);如果只需要计数,空间可以降到O(k)(栈+临时数组)。
  • 临时变量:复用的临时数组(比如你的curr)最大长度是k,这部分属于固定开销,也要算进去。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 03:31:02