• 前端算法之搜索插入位置


    给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。这就是搜索插入位置算法。与二分算法很相似

    示例 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

    1. var searchInsert = function(nums, target) {
    2. let left = 0,right = nums.length -1 ,n = nums.length
    3. while (left <= right) {
    4. let mid = (left + right) >> 1
    5. if(nums[mid] >= target) {
    6. // 值在左侧
    7. n = mid
    8. right = mid - 1
    9. }else {
    10. // 右侧
    11. left = mid + 1
    12. }
    13. }
    14. return n
    15. };

    解题如上。此题的解题方案如下:

    1. 根据题头我们可以知道这是一个排序好的数组。所以我们直接可以基于二分查找来进行坐。

    2. 我们在数组中找到目标值,返回其索引,跟之前二分查找的时候是一致的。

    3. 如果目标值不存在数组中,那么返回它会被插入的位置。这里可以的理解就是,分为两种,

    • 第一种,target 的值是在数组中的,这时候我们利用二分可以找到最近的下标,返回出去即可解答。
    • 第二种,target的值不在数组中,也就是说数组中没有。如何进行呢?

    假设数组为: [1,2,3,4,5,6]  target 为 0 ,默认抛出的值 N  为 0

    这样的话,我们通过三次二分就可以发现1的坐标为0.即 我们找寻最接近的值的下标则为0.

    但是如果我们的 target 为 7 呢。 这时候会发现测试用例走不过去了。

    这是什么愿意呢?是因为,我们的target为7,则依旧需要三次二分。

    第一次二分后的中间值是2,第二次4 ,第三次5.但是它依旧没有找到位置。说明方法没进入,这时候如果初始化 N 是 0 的话,则方法会直接返回 0  造成错误。这时候大家明白了吧。

    也就是说,当target 的值大于 nums[mid]的值的时候, 就证明target 比 nums 数组的当前的中间件的值大,我们只需要移动left 坐标,让二分继续即可。所以我们就默认初始化N应该是数组的长度。直到数组的某个值大于 target 的值的时候,这时候它才能被改变为当前中间值的下标。否则的话就是 数组的长度。

     如上。三次打印都没有进入判断方法。所以它默认返回的则是数组的长度。如果进去的话,则一定会修改n的值为当前中间值的下标。

  • 相关阅读:
    掌握Linux技能:关键命令与测试题解析
    JVM认识之垃圾收集算法
    CTF之信息收集
    C++学习第二十九天----引用变量和c语言之register关键字
    用Abp实现两步验证(Two-Factor Authentication,2FA)登录(二):Vue网页端开发
    uniapp离线打包apk - 安卓篇
    c++ 11 原子操作库 (std::atomic)(二)
    Springboot毕业设计毕设作品,个人博客系统设计与实现
    Linux系统彻底卸载MySQL数据库
    详谈mysql各种常用操作数据表结构的用法【建议收藏】
  • 原文地址:https://blog.csdn.net/qq_31281245/article/details/127638172