LeetCode刷题记录----35.搜索插入位置(Easy)

2025/8/28

题目(Easy):


我的思路:

因为要求时间复杂度为O(log n),因此自然联想到折半查找。即定义左右边界 left,right,根据它们中间的mid = (left+right)/2(向下取整)索引位置和target值的大小,来逐步缩小搜索的区间。

最后如果没有检索到目标值的话,插入的位置就是left指针当前指向的位置。因为如果最后mid处的值大于target的话,那应该插入位置为mid;如果mid处的值小于target的话,那应该插入位置为mid+1的位置。而这两个位置正好也都对应两种情况下left指针的位置,因此正好返回left;

具体代码如下:

cpp 复制代码
class Solution {
public:
    int searchInsert(vector<int>& nums, int target) {
        //二分查找了
        int left  = 0;
        int right = nums.size()-1;  //确定好左右边界
        int mid = 0;
        while(left <= right){
            mid = left + (right - left) / 2;
            if(nums[mid] == target){
                return mid;
            }
            else if(nums[mid] > target){
                right = mid - 1;
            }
            else if(nums[mid] < target){
                left = mid + 1;
            }
        }

        //return nums[mid] > target ? mid : mid+1;
        return left;    //如果target 比 mid 位置小,那么mid和left会在同一位置;如果Target比mid大,那么最后left 还会 = mid + 1;和上面的表达式结果一致
    }
};

时间复杂度:O(log n)

空间复杂度:O(1)


总结:

①对于要求时间复杂度简化到O(logN)的有序数组中的检索,可以想到用折半查找

②对于最后没有找到需要插入的位置,正好插入 left指针指向的位置