给定一个升序数组和一个目标值,返回目标值的索引。
如果不存在,返回目标值按照顺序应该插入到的位置。
假设数组中没有重复元素。
示例:
Example 1:
Input: [1,3,5,6], 5
Output: 2
Example 2:
Input: [1,3,5,6], 2
Output: 1
Example 3:
Input: [1,3,5,6], 7
Output: 4
Example 4:
Input: [1,3,5,6], 0
Output: 0
思路
在一个有序数组中查询某个目标值的位置,可以使用经典的二分法。
但本题在当查询不到此元素时,需要返回此元素应该插入到的位置,来保证新数组仍然是一个有序数组。
因此,需要在经典二分法的基础上进行改进,如果元素存在,那么逻辑与经典二分法相同;如果元素到最后没有查询到,那么需要额外确认此元素需要插入的位置。
我们使用递归进行二分法,当元素最后没有查询到时,一定是当前数组的长度只有2位时。如果数组第一位不等于目标值,那么肯定小于目标值(因为二分法的每次递归都会保证目标值的大小是位于当前数组的最小值和最大值的范围之内的),因此目标值需要插入的位置肯定是数组的第二位。
python实现
def searchInsert(nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: int
二分法查找。
结束条件需要改变一下:当查找到最后两位时,如果都不满足,则返回应该插入到的位置。
"""
def binary_search(nums, l, u, target):
'''
二分法查找。
调用此函数之前需要保证:
1、nums[l] <= target <= nums[u]
2、len(nums) >= 2
'''
if u - l == 1:
if nums[l] == target:
return l
else:
return u
mid = (l+u) // 2
if nums[mid] == target:
return mid
elif target > nums[mid]:
return binary_search(nums, mid, u, target)
else:
return binary_search(nums, l, mid, target)
if not nums:
return 0
if target <= nums[0]:
return 0
if target > nums[-1]:
return len(nums)
return binary_search(nums, 0, len(nums)-1, target)
if '__main__' == __name__:
nums, target = [1,3,5,6], 0
print(searchInsert(nums, target))