一、题目描述
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
示例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)
三、总结
本题的重点在于分析目标数可能存在的位置,分别是在数组之前,数组之后,两个数字之间,还有确定的某个数。