搜索插入位置(力扣题)

题目:给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。来源:力扣(LeetCode)

请必须使用时间复杂度为 O(log n) 的算法 

示例以及输出结果 来源:力扣(LeetCode)

示例 1:
输入: nums = [1,3,5,6], target = 5
输出: 2

示例 2:
输入: nums = [1,3,5,6], target = 2
输出: 1

示例 3:
输入: nums = [1,3,5,6], target = 7
输出: 4

使用时间复杂度为 O(log n) 的算法 O(log n) 对应的是二分法

、解法1:标准二分法

  • 区间定义:左闭右闭区间 [l, r],初始时 l=0r=nums.length-1

  • 循环条件l <= r,确保区间有效。

  • 中间值计算mid = l + Math.floor((r - l) / 2)

  • 边界调整

    • 若 nums[mid] === target,直接返回 mid

    • 若 nums[mid] > target,说明目标在左半部分,调整右边界 r = mid - 1

    • 否则调整左边界 l = mid + 1

  • 返回值:循环结束后返回 l,即插入位置。

/**
 * @param {number[]} nums
 * @param {number} target
 * @return {number}
 */

// 传值 [1,3,5,6] 7
var searchInsert = function(nums, target) {
    // 关键点: 无重复元素 的 升序 排列数组
    
    /**
        标准二分查找法     
        左右区间闭合 【1,r】
        循环条件 l<=r
        终止条件 l>r
        插入位置逻辑 返回 l
        使用场景 精确查找 或 插入位置
      
    */
    let l = 0;
    let r = nums.length - 1;
    while(l<=r){
      const mid = l + Math.floor((r-l)/2);
      if(nums[mid]===target)return mid;
      if(nums[mid]>target){
          r = mid - 1;
      }else{
          l = mid + 1
      }
    }
    return l

    
};

、解法2:左侧边界二分法

  • 区间定义:左闭右开区间 [left, right),初始时 left=0right=nums.length

  • 循环条件left < right,确保区间有效。

  • 中间值计算mid = left + Math.floor((right - left) / 2)

  • 边界调整

    • 若 nums[mid] === target,继续向左压缩右边界 right = mid

    • 若 nums[mid] < target,调整左边界 left = mid + 1

    • 否则调整右边界 right = mid

  • 返回值:循环结束返回 left,即左侧插入位置

/**
 * @param {number[]} nums
 * @param {number} target
 * @return {number}
 */
// 传值 [1,3,5,6] 7
var searchInsert = function(nums, target) {

    // 关键点: 无重复元素 的 升序 排列数组

    /**
        左侧边界二分法     
        左区间闭合, 右区间开放 【1,r)
        循环条件 l<r
        终止条件 l=r
        插入位置逻辑 返回 l
        使用场景 需找最左侧匹配 或 插入位置
   
    */
    let l = 0;
    let r = nums.length;
    while(l<r){
        const mid = l + Math.floor((r - l)/2);
        if(nums[mid]===target){
            r = mid
        }else if(nums[mid]>target){
            r = mid;
        }else if(nums[mid]<target){
            l = mid+1;
        }
    }
    return l
    
};

三、两种方法的对比

步骤标准二分法左侧边界二分法
区间定义左闭右闭 [l, r]左闭右开 [left, right)
循环条件l <= rleft < right
调整逻辑直接收缩左右边界压缩右边界以寻找左侧
结果返回 l(插入位置)返回 left(插入位置)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值