题目描述
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
请必须使用时间复杂度为 O(log n) 的算法。
解题思路
要满足对时间复杂度的要求,选择二分查找。
注意事项
- target小于最小值时返回0,大于最大值时返回n
- 跳出循环时right==left,target既可能在区间左边,也可能在区间右边,target<nums[right]则返回right,大于时要返回right+1
代码
C语言:
int searchInsert(int* nums, int numsSize, int target){
int left=0, right, i;
right = numsSize - 1;
if(target < nums[left]) return left;
if(target > nums[right]) return right+1;
while(left<right){
i = (left+right)/2;
if(target == nums[i]) return i;
else if(target > nums[i]) left = i + 1;
else right = i - 1;
}
if(target>nums[right]) return right+1;
else return right;
}
Python:
class Solution:
def searchInsert(self, nums: List[int], target: int) -> int:
right = len(nums)-1
left = 0
if target>nums[right]:
return right+1
if target<nums[left]:
return left
while left<right:
i = int((left+right)/2)
if target==nums[i]:
return i
elif target>nums[i]:
left = i+1
elif target<nums[i]:
right = i-1
if target>nums[right]:
return right+1
else:
return right