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

方法一:二分查找
假设题意是在排序数组中寻找是否存在一个目标值,则可以利用二分法在Ologn的时间内找到是否存在目标值,但这题还有个额外条件,即如果不存在数组中的时候需要返回按顺序插入的位置。需要对二分法做些修改
考虑这个插入的位置pos,它成立的条件为:
nums[pos-1]<target<=nums[pos]
其中nums代表排序数组,由于如果存在这个目标值,返回的索引也是pos,即可以将两个条件合并后并得出最后的目标:在一个有序数组中找到第一个大于等于target的下标
问题转化到这个,直接套用二分法即可,即不断用二分法逼近查找第一个大于等于target的下标,ans初始设置为数组长度可以省略边界条件的判断,因为存在一种情况是target大于数组中的所有数,此时需要插入到数组长度的位置。
python
class Solution(object):
def searchInsert(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: int
"""
left=0 #指向数组的起始位置(索引0)
right=len(nums)-1 #指向数组的末尾位置(最后一个元素的索引)
while left<=right: #左指针不大于右指针。这保证了搜索区间始终有效
middle=(left+right)//2 #计算中间位置的索引
if nums[middle]<target: #如果中间元素小于目标值,说明目标值应该在右半部分
left=middle+1 #将左指针移动到中间位置右侧
elif nums[middle]>target: #如果中间元素大于目标值,说明目标值应该在左半部分
right=middle-1 #将右指针移动到中间位置左侧
else:
return middle
return right+1 #循环结束还没找到目标值,right+1就是它应该插入的位置1
时间复杂度:O(logn)其中n为数组的长度
空间复杂度:O(1)
源自力扣官方题解