题目描述
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
请必须使用时间复杂度为 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
分析
题目要求算法时间复杂度为logn,因此不能全部依次遍历(时间复杂度为n),于是采用二分法,定义两个指针分别指向头尾,再定义res作为新数组的长度,默认长度为numsSize,当左指针小于等于右指针时,定义指针mid指向中间元素,如果target小于等于mid,即在左侧,res赋值为mid,再将范围缩小,right = mid - 1;如果targe在mid右侧,即大于mid,直接left = mid + 1 即可,最后返回res。
代码实现
int searchInsert(int* nums, int numsSize, int target){
int left = 0, right = numsSize-1, res = numsSize;
while(left <= right ){
//对mid进行向右移动一位,例如 7 >> 1 = 0111 >> 1 = 0011 = 3
//和 7/2 结果相同,性能更佳
int mid = ((right - left) >> 1)+left;
//在数组左侧
if(target <= nums[mid]){
res = mid;
right = mid-1;
//在数组右侧
}else{
left = mid+1;
}
}
return res;
}