刷LeetCode时二分查找是高频考点而35题「搜索插入位置」更是二分查找的入门级经典——它不仅考察对二分查找核心逻辑的理解还需要灵活处理“目标值不存在”的边界场景。今天就来拆解这道题的解题思路一步步看懂代码背后的逻辑吃透O(log n)时间复杂度的实现要点。题目回顾给定一个排序数组和一个目标值在数组中找到目标值并返回其索引。如果目标值不存在于数组中返回它将会被按顺序插入的位置。核心约束必须使用时间复杂度为 O(log n) 的算法。这里要注意题目明确给出“排序数组”这是二分查找能够适用的前提——二分查找的核心就是利用“有序”特性每次将查找范围缩小一半从而实现对数级的时间复杂度比暴力遍历O(n)高效得多。解题思路二分查找的边界处理二分查找的关键的是「定义查找区间」和「处理边界条件」这道题的难点在于当目标值不在数组中时如何精准找到它的插入位置。我们先明确核心思路定义左右指针划定查找区间本题采用「左闭右闭」区间即left ≤ right时区间内仍有元素可查找计算中间位置mid通过比较target和nums[mid]的大小缩小查找范围用一个变量ans记录“可能的插入位置”默认值设为数组长度n对应目标值比所有元素都大的情况当target ≤ nums[mid]时说明目标值可能在mid左侧或就是mid此时更新ans为mid并将右指针左移right mid - 1当target nums[mid]时说明目标值在mid右侧将左指针右移left mid 1循环结束后ans即为目标值的索引存在时或插入位置不存在时。代码逐行解析给出的代码简洁高效我们逐行拆解看懂每一步的作用functionsearchInsert(nums:number[],target:number):number{constnnums.length;letleft0,rightn-1,ansn;// 维护两个闭区间while(leftright){letmid(leftright)1;if(targetnums[mid]){ansmid;rightmid-1;}else{leftmid1;}}returnans;};1. 变量初始化const n nums.length;记录数组长度避免多次调用nums.length提升效率let left 0, right n - 1;定义左指针指向数组起始位置和右指针指向数组末尾位置确立「左闭右闭」的查找区间ans n;初始化插入位置为数组长度这是一个“兜底”设置——当target比数组中所有元素都大时插入位置就是数组末尾即索引n。2. 二分查找循环while (left right)循环条件是左指针不大于右指针这是「左闭右闭」区间的核心特征——当left right时区间内还有最后一个元素需要判断避免遗漏。3. 中间位置计算let mid (left right) 1;计算中间索引mid这里用「右移1位」代替「除以2」效率更高二进制右移1位等价于整除2且计算机处理位运算比除法更快。注意也可以写成mid Math.floor((left right) / 2)两者效果一致但右移写法更简洁高效。4. 核心判断逻辑这部分是整个算法的核心负责缩小查找范围并更新插入位置if (target nums[mid])如果目标值小于等于中间元素说明目标值要么就是nums[mid]要么在mid的左侧区间。此时我们将ans更新为mid因为mid是当前可能的插入位置然后将右指针right移到mid - 1缩小查找范围到左半部分。else如果目标值大于中间元素说明目标值在mid的右侧区间此时不需要更新ans因为当前mid不可能是插入位置直接将左指针left移到mid 1缩小查找范围到右半部分。5. 返回结果return ans;循环结束后left会大于right此时ans已经记录了目标值的索引存在时或正确的插入位置不存在时。关键细节为什么这样能找到插入位置很多人会疑惑ans的更新逻辑为什么能精准定位插入位置我们举两个例子理解示例1nums [1,3,5,6]target 5目标值存在循环过程中当mid 2nums[mid] 5target nums[mid]ans更新为2right 1。之后循环结束返回ans2正确。示例2nums [1,3,5,6]target 2目标值不存在初始left0right3ans4mid1nums[mid]3target2 3ans更新为1right0mid0nums[mid]1target2 1left1循环结束left1 right0返回ans1即插入位置在1和3之间正确。本质上ans始终记录着“当前最接近target且大于等于target的元素索引”当循环结束时这个索引就是插入位置如果target不存在或者就是target本身的索引如果存在。总结这道题的核心是「二分查找的边界处理」重点掌握3点「左闭右闭」区间的定义的循环条件left rightans变量的作用——兜底插入位置动态更新可能的插入点mid的计算方式右移1位和指针移动逻辑缩小一半范围。二分查找的难点在于边界条件的处理这道题作为入门题能帮我们快速掌握二分查找的核心逻辑。记住只要数组有序就可以优先考虑二分查找而「左闭右闭」区间是最容易理解和实现的方式之一。