35.搜索插入位置


一、题目描述

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

示例1

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

示例2

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

二、解题步骤

1.思路

可能插入的位置如下图所示:
在这里插入图片描述
插入情况1、4可以提前进行处理。接下来我们来看情况2、3分别会发生什么?
情况2、相当于最普通的二分查找,处理时返回mid。

情况3、如图所示可以看出2要插入到1和3之间,即是数组索引为1的位置(相当于left所指向数组中的索引值)

2.代码

class Solution {
    public int searchInsert(int[] nums, int target) {
        int len = nums.length;
        if(nums[0]>target) return 0; //目标值在所有数之前
        if(nums[len-1]<target) return len;//目标值在所有数之后


        int i=0,j=len-1;
        while(i<=j){
            int mid = i + ((j-i)>>1);
            if(nums[mid]==target){
                return mid; //数组中确定的某个数
            }else if(nums[mid]>target){
                j=mid-1;
            }else if(nums[mid]<target){
                i=mid+1;
            }
        }

	   //在两数之间。
       return i; 
    }
}

3.复杂度分析

时间复杂度:O(logn)
空间复杂度:O(1)


三、总结

本题的重点在于分析目标数可能存在的位置,分别是在数组之前,数组之后,两个数字之间,还有确定的某个数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值