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

如何高效查找整数数组中缺失的数字 现有O(n)实现求优化方案

缺失数字查找优化方案

首先明确你当前实现的性能问题:

你以为现有代码的时间复杂度是O(n),但实际存在很大优化空间:filter的遍历次数等于数组首尾元素的差值+1,而Array.contains()单次调用的时间复杂度是O(n),整体复杂度实际为O(n*(end-start)),当数组首尾差值较大时性能会非常差。

以下是两种不同场景的优化实现:

方案1:利用Set降低查询复杂度(适用于无序数组)

将原数组先转成Set,元素存在性查询的复杂度直接降到O(1),整体时间复杂度优化为O(n + (end-start)),相比原实现提升非常明显。

func findMissingNo(arrA: [Int]) -> [Int] {
    guard !arrA.isEmpty else { return [] }
    let minVal = arrA.min()!
    let maxVal = arrA.max()!
    let numSet = Set(arrA)
    return (minVal...maxVal).filter { !numSet.contains($0) }
}

方案2:单次遍历有序数组(最优解,纯O(n)时间复杂度)

如果你的输入数组默认是升序排列的(你给出的示例输入就属于有序场景),不需要额外存储结构,直接遍历一次数组对比相邻元素即可,差大于1的区间就是缺失的数字,空间复杂度仅为O(1)(不计结果存储占用)。

func findMissingNo(arrA: [Int]) -> [Int] {
    guard arrA.count > 1 else { return [] }
    var missingNums: [Int] = []
    for i in 1..<arrA.count {
        let prevNum = arrA[i-1]
        let currentNum = arrA[i]
        if currentNum - prevNum > 1 {
            missingNums.append(contentsOf: (prevNum+1)..<currentNum)
        }
    }
    return missingNums
}

// 测试调用
findMissingNo(arrA: [11,12,14,15,16,18]) // 输出 [13, 17]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 08:06:05