35. 搜索插入位置
难度 简单
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
请必须使用时间复杂度为 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
示例 4:
输入: nums = [1,3,5,6], target = 0
输出: 0
示例 5:
输入: nums = [1], target = 0
输出: 0
提示:
1 <= nums.length <= 104-104 <= nums[i] <= 104nums为无重复元素的升序排列数组-104 <= target <= 104
题解
这道题同样是一个查找的题目,题目同样是一道查找的题目,给出的也是有序数组,可用二分进行查找。
- 当nums[mid]=target时,返回mid
- 当nums[mid]<target时,所要查找的值在mid的右边,更新low=mid+1
- 当nums[mid]>target时,所要查找的值在mid的左边,更新heigh=mid-1
但是有特殊的条件,如果不在数组中就返回合适的位置。这个条件的话,在返回时候特殊处理一下,平时我们返回一般都是mid,但是mid在跳出while循环的时候就出现问题了,mid还是上次的值,在最后返回的时候要进行条件判断。
- 如果nums[mid]>=target时,返回mid
- 如果nums[mid]<target时,返回mid+1
int searchInsert(int* nums, int numsSize, int target){
int low=0;
int heigh=numsSize-1;
int mid;
while(low<heigh){
mid=low+(heigh-low)/2;//防止溢出
if(nums[mid]==target){
return mid;
}else if(nums[mid]>target){
heigh=mid-1;
}else{
low=mid+1;
}
}
mid=low+(heigh-low)/2;
if(nums[mid]==target){
return mid;
}else if(nums[mid]>target){
return mid;//如果nums[mid]<target时,返回mid+1
}else{
return mid+1;//如果nums[mid]<target时,返回mid+1
}
}