剑指leetcode—搜索插入位置

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

你可以假设数组中无重复元素。

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

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

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

示例 4:
输入: [1,3,5,6], 0
输出: 0

方法一:

二分查找加分析法

毫无疑问,与查找有关的算法比较优的解法就是二分查找法
算法流程

  1. 首先定义两个指针l,r,初始值给定,然后进入while循环
  2. 判断如果数组的第一个数都大于或者等于target,那么ans(存放答案用)的值就是数组第一个下标的l。
  3. 如果数组的最后一个数都小于target,那么ans=最后一个数的下标值加一
  4. 如果数字的最后一个数等于target,那么ans=最后一个数的下标
  5. 计算mid
  6. 如果中间的nums【mid】==target,则ans=mid;
  7. 如果nums【mid】>target,数组的搜索范围发生变化,右下标r=mid-1
  8. 如果nums【mid】<target,同第七步
  9. 如果循环没有结束,继续判断新的子数组和target的关系
class Solution {
    public int searchInsert(int[] nums, int target) {
        int l=0;
        int r=nums.length-1;
        int ans=0;
        while(l<=r)
        {
            if(nums[l]>=target)
            {
                ans=l;
                break;
            }
            if(nums[r]<target)
            {
                ans=r+1;
                break;
            }
            if(nums[r]==target)
            {
                ans=r;
                break;
            }
            int mid=(l+r)/2;
            if(nums[mid]==target)
            {
                ans=mid;
                break;
            }
            else if(nums[mid]>target)
            {
                r=mid-1;
            }
            else if(nums[mid]<target)
            {
                l=mid+1;
            }
        }
        return ans;
    }
}

这个算法时间效率很高,但是空间消耗大。

呜呜呜,其实这道题就是二分查找,是我想复杂了,还搞出这么多if判断。
可以在最后直接返回 l(左边界)。

class Solution {
    public int searchInsert(int[] nums, int target) {
        int l=0;
        int r=nums.length-1;
        int ans=0;
        while(l<=r)
        {
            int mid=(l+r)/2;
            if(nums[mid]==target)
            {
                return mid;
            }
            else if(nums[mid]>target)
            {
                r=mid-1;
            }
            else if(nums[mid]<target)
            {
                l=mid+1;
            }
        }
        return l;
    }
}

在这里分享一下大佬们总结出来的二分查找 两种模式

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Devin Dever

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值