前端算法之搜索插入位置

举报
赵小左 发表于 2022/11/09 16:07:25 2022/11/09
【摘要】 ​给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。这就是搜索插入位置算法。与二分算法很相似示例 1:输入: nums = [1,3,5,6], target = 5输出: 2示例 2:输入: nums = [1,3,5,6], target = 2输出: 1示例 3:输入: nums = [1,3,5,6], targe...

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

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

var searchInsert = function(nums, target) {
        let left = 0,right = nums.length -1 ,n = nums.length
            while (left <= right) {
                let mid = (left + right) >> 1
            if(nums[mid] >= target) {
                    // 值在左侧
                    n = mid
                    right = mid - 1
            }else {
                // 右侧
                left = mid + 1       
            }
            }
            return n
};

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

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的值为当前中间值的下标。


【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。