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

Array.filter的空间复杂度是多少?LeetCode数组找重复4种解法复杂度疑问

四个解法的空间复杂度分析

首先明确空间复杂度的计算规则:我们统计的是算法执行过程中额外申请的内存空间峰值,和变量引用的重新赋值无关,同时LeetCode默认规则下如果没有特殊说明,输出占用的空间也会纳入统计(题目明确说明输出不计入的情况除外)。

  • 选项1:空间复杂度为 O(n)
    你的判断是正确的,result数组是独立申请的额外数组,最坏情况下长度可以达到n/2(比如数组是[1,1,2,2,3,3...]),属于线性级别的额外空间,不符合O(1)要求。
  • 选项2:空间复杂度为 O(n)
    原生filter方法的底层实现就是生成一个全新的数组存储符合条件的元素,不管你之后是否把新数组赋值给原nums变量,执行filter的过程中已经申请了额外的O(n)空间,所以依然是线性空间复杂度。
  • 选项3:空间复杂度为 O(n)
    和选项2没有本质区别,都是调用原生filter生成新数组,只是省略了赋值给nums变量的步骤,额外空间占用完全一致。
  • 选项4:空间复杂度为 O(1)
    你的判断正确,filterInPlace是原地修改原数组,全程只用到了i、j两个临时变量,没有申请任何额外的数组空间,完全符合题目要求的O(1)空间限制。

补充说明

很多人会有“把新数组赋值给原变量就等于没有额外空间”的误区,这是不对的。空间复杂度统计的是执行过程中的内存峰值,你调用filter生成新数组的瞬间,内存里同时存在原数组和新数组两个O(n)级别的数组,所以峰值占用就是O(n),和之后是否释放原数组的引用没有关系。
如果刷题时不想每次手写filterInPlace,也可以在第一次循环结束后,直接遍历数组把不符合条件的元素移到前面,最后截断数组返回,逻辑和filterInPlace完全一致,代码量也不大。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 01:39:03