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

LeetCode搜索插入位置:二分查找代码疑问与优化方案

问题根因说明

你观察到的middle指针"滞后"不是二分逻辑的问题,核心是你循环结束后围绕middle值硬凑返回结果的思路从根源上走了弯路,两个典型场景的执行过程拆解如下:

  • 示例3(nums = [1,3,5,6], target = 7)执行流程:
    初始left=0, right=3
    第一次计算middle=1(值为3),7>3 → left=2
    第二次计算middle=2(值为5),7>5 → left=3
    第三次计算middle=3(值为6),7>6 → left=4,此时left>right循环终止,middle停在索引3的位置。你代码里写的return middle + 2纯粹是为了凑这个场景的结果写的硬编码,不是通用逻辑,自然会觉得middle位置"不对"。
  • 示例4(nums=[1], target=0)执行流程:
    你额外加了数组长度判断,单元素场景下middle固定为0,第一次循环判断0<1 → right=-1循环终止。另外你代码里存在拼写错误:nums.lenght(正确写法是nums.length),导致你写的单元素专属判断分支永远不会触发,走通用分支时很容易出现不符合预期的结果。
现有代码的核心缺陷
  • 存在无效分支:middle = nums.length>1 ? (Math.floor(left + (right - left)/2)) : 0完全多余,二分的middle计算逻辑对长度为1的数组天然生效,单元素时left=right=0,计算出来的middle本来就是0,不需要特殊处理。
  • 拼写错误导致逻辑失效:nums.lenght的笔误让单元素判断分支完全不生效。
  • 返回逻辑冗余易错:在left <= right的循环终止条件下,循环结束时left指针的位置天然就是目标值的正确插入位置,根本不需要围绕最后一次的middle值对比前后元素、硬凑返回规则,这也是你觉得分支繁琐、边界场景覆盖不住的核心原因。
  • 硬编码逻辑无通用性:类似return middle + 2的写法是凑测试用例出来的,换更长的数组、更大的target值会直接出错。
简洁鲁棒的优化实现

不需要任何特殊分支判断,标准二分逻辑即可覆盖所有场景:

/**
 * @param {number[]} nums
 * @param {number} target
 * @return {number}
 */
var searchInsert = function(nums, target) {
    let left = 0;
    let right = nums.length - 1;
    while (left <= right) {
        // 统一计算middle,用位运算>>1等价于Math.floor(/2),性能更好
        // 该写法避免left+right整数溢出,面试时写这个写法更能体现边界意识
        const middle = left + ((right - left) >> 1);
        if (nums[middle] === target) return middle;
        if (target < nums[middle]) {
            right = middle - 1;
        } else {
            left = middle + 1;
        }
    }
    // 直接返回left即可覆盖所有target不存在的场景:
    // 1. target比所有元素小:left=0,插入头部
    // 2. target比所有元素大:left=nums.length,插入尾部
    // 3. target在两个元素之间:left刚好是第一个比target大的元素索引,即插入位置
    // 4. 单元素数组、target为0/边界值等场景全部自动覆盖,不需要额外判断
    return left;
};

这个实现时间复杂度为标准的O(log n),所有测试用例均可正确通过。

面试相关优化点
  • 上述实现已经满足面试的基本要求,逻辑清晰无冗余,边界场景全覆盖。
  • 额外可优化的细节:
    • 固定不变的变量(比如每次循环内的middle)用const声明,比let更严谨,体现代码规范意识
    • 提交前删掉所有调试用的console.log语句,不要留调试痕迹
    • 不要为特殊场景写专属判断分支,通用逻辑能覆盖的场景分支越少,代码鲁棒性越高
    • 可以主动向面试官说明middle计算写法避免整数溢出的考量,体现对底层细节的理解

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 12:36:20