给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
你可以假设数组中无重复元素。
示例 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在列表中,直接利用列表的index方法返回target的索引;
如果不在列表中就要找到插入位置的索引。
确定中间位置之后,判断中间位置的值与target的大小关系,如果nums[mid]<target,那么target就应该插在mid右边的某个位置,下面继续判断,如果target<nums[mid+1],target就应该插在mid+1这个位置,否则的话nums[mid+1]<target就更新low=mid+1;同理得nums[mid]>target的情况。low和high不断更新的过程中,如果没能找到插入的位置,就说明target要么大于要么小于列表中所有元素,此时low=high=len(nums)-1/0.再进一步判断属于两者哪种情况,返回对应的插入位置的索引值。(这个方法中mid+1、mid-1可能会出现索引错误,所以可以在刚开始的时候把头插和尾插两种特殊情况考虑进去,除此之外的情况就完全包括在while loop里边了)
class Solution(object):
def searchInsert(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: int
"""
if target in nums:
return nums.index(target)
low = 0
high = len(nums)-1
if target<nums[0]:
return 0
if target>nums[-1]:
return high+1
while low<=high:
mid = (low+high)//2
if nums[mid]<target:
if target<nums[mid+1]:
return mid+1
else:
low = mid+1
else:
if nums[mid-1]<target:
return mid
else:
high = mid-1
return low
class Solution(object):
def searchInsert(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: int
"""
if target in nums:
return nums.index(target)
low = 0
high = len(nums)-1
while low<high:
mid = (low+high)//2
if nums[mid]<target:
if target<nums[mid+1]:
return mid+1
else:
low = mid+1
else:
if nums[mid-1]<target:
return mid
else:
high = mid-1
if target<nums[0]:
return 0
else:
return low+1