题目描述
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
请必须使用时间复杂度为 O(log n)
的算法。
示例 1:
输入: nums = [1,3,5,6], target = 5
输出: 2
示例 2:
输入: nums = [1,3,5,6], target = 2
输出: 1
示例 3:
输入: nums = [1,3,5,6], target = 7
输出: 4
提示:
1 <= nums.length <= 10^4
-10^4 <= nums[i] <= 10^4
nums
为 无重复元素 的 升序 排列数组-10^4 <= target <= 10^4
思路
题目要求时间复杂度为 O(log n)
的算法,且数组有序,可以联想到二分查找。
没有找到目标值时需要返回left、right或者right+1,这个由二分查找的写法决定。
代码
C++版本,左闭右闭版二分查找:
class Solution {
public:
int searchInsert(vector<int>& nums, int target) {
//左闭右闭版二分查找
//判断target是否越界
if(target>nums[nums.size()-1]){
return nums.size();
}
else if(target<nums[0]){
return 0;
}
int left=0;
int right=nums.size()-1;
while(left<=right){
int middle = left+(right-left)/2;
if(nums[middle]>target){
right=middle-1;
}
else if(nums[middle]<target){
left=middle+1;
}
else{
return middle;
}
}
return left;
//return right+1;
}
};
Python版本,左闭右开版二分查找:
class Solution:
def searchInsert(self, nums: List[int], target: int) -> int:
#左闭右开版二分查找
#判断target是否越界
if target>nums[len(nums)-1]:
return len(nums)
elif target<nums[0]:
return 0
left=0
right=len(nums)
while left<right:
middle=left+(right-left)//2
if nums[middle]>target:
right=middle
elif nums[middle]<target:
left=middle+1
else:
return middle
return left
#return right
需要注意的地方
1.Python整除需要使用"//"。
2.注意什么时候该返回right+1,什么时候该返回right。