题目描述:
解题思路:
使用二分查找算法解题,但是要注意查到不到时的判断。具体步骤为:
1、首先处理几种特殊情况。
- 当nums为空时,返回0
- 当target<nums[0]时,返回0
- 当target>nums[-1]时(即大于最大的数),返回len(nums)
2、对一般情况进行处理。直接使用二分查找算法即可。初始化low=0,high=len(nums)-1,mid=(low+high)//2。在low<=high的条件下比较nums[mid]与target的大小
- 如果target=nums[mid],说明查找到了,返回mid
- 如果target>nums[mid],则令low=mid+1,然后重新计算mid后继续循环查找
- 如果target<nums[mid],则令high=mid-1,然后重新计算mid后继续循环查找
3、循环结束后没有返回结果说明此时low>high,数组中没查找到target,又由于在第1步中已经对几种特殊条件作了判断,此时low>high而且low与high都是在[0, len(nums)-1]这个范围的,那么说明target肯定是大于nums[high]而且小于nums[low]的,此时low就是它要插入的位置,最后返回low即可
复杂度分析:
由于使用了二分查找,所以时间复杂度为o(log(n))
空间复杂度为o(1)
python代码:
class Solution(object):
def searchInsert(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: int
"""
if not nums:
return 0
if target < nums[0]:
return 0
if target > nums[-1]:
return len(nums)
low = 0
high = len(nums) - 1
while low <= high:
mid = (low + high) // 2
if target == nums[mid]:
return mid
elif target > nums[mid]:
low = mid + 1
else:
high = mid - 1
return low