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

JavaScript算法:有序差1数组查找异常值索引的更优方案咨询

优化方案:使用二分查找实现*O(logn)*时间复杂度

因为数组仅存在一处异常,其余相邻元素差值均为1,存在核心规律:无异常的区间内,任意下标i位置的元素值必然等于arr[0] + i。异常点左侧所有元素都符合该规律,异常点及右侧所有元素都会比该公式计算的预期值大,因此可以用二分查找快速定位异常点,不需要遍历全数组。

实现代码

function getAnomaly(sortedArray) {
    const len = sortedArray.length
    // 数组长度小于2不存在相邻元素,无异常
    if (len < 2) return -1
    let left = 0
    let right = len - 1
    let anomalyIndex = -1
    while (left <= right) {
        const mid = Math.floor((left + right) / 2)
        // 计算mid位置的预期值
        const expected = sortedArray[0] + mid
        if (sortedArray[mid] === expected) {
            // 左半段无异常,去右半段查找
            left = mid + 1
        } else {
            // 记录当前可能的异常点,去左半段找更靠前的异常点
            anomalyIndex = mid
            right = mid - 1
        }
    }
    return anomalyIndex
}

// 测试用例
const sortedArray = [100, 101, 102, 107]
console.log(getAnomaly(sortedArray)) // 输出3
console.log(getAnomaly([1,2,3,4])) // 输出-1

效率对比

  • 原遍历方案时间复杂度为O(n),空间复杂度O(1)
  • 二分方案时间复杂度为O(logn),空间复杂度O(1),在数组长度较大时效率提升极为明显,比如长度为10万的数组仅需要最多17次查找即可得到结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 06:39:03