题目描述
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
你可以假设数组中无重复元素。
示例 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
解题思路
二分法,如果可以直接找到target,输出位置,如果找不到,判断target和left的大小确定插入位置。
class Solution:
def searchInsert(self, nums: List[int], target: int) -> int:
n = len(nums)
# 二分法要排除单一元素数组
# 讨论数组只有一个元素时的三种情况
if n == 1:
if nums[0] < target:
return 1
elif nums[0] == target:
return 0
else:
return 0
left,right = 0,n - 1
# 二分查找target位置或者插入位置
while left < right:
mid = (left+right) // 2
#print(left,right,mid)
if nums[mid] == target:
return mid
if nums[mid] > target:
right = mid
else:
left = mid + 1
# 当left==right,且没有查找到target时,
# 有两种可能,target >= nums[left],此时应该插入在left的下一个位置
# taget < nums[left],此时在left位置进行插入
if target > nums[left]:return left + 1
if target <= nums[left]: return left