给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
请必须使用时间复杂度为 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.自己的解法。看到排序的数组,再加上查找,第一个想到的就是二分法。
class Solution {
public int searchInsert(int[] nums, int target) {
int length = nums.length;
int left = 0;//左指针
int right = length - 1;//右指针
while(left <= right){
int middle = (left + right)/2;
if(nums[middle] == target){//找到了和目标值一样的,返回下标
return middle;
}else if(nums[middle] > target){//如果大于目标值,说明在左侧,减小right
right = middle - 1;
}else{//如果小于目标值,说明在右侧,增大left
left = middle + 1;
}
}
return right + 1;//没有找到的情况,此时right指向的肯定是比目标值小的,插入位置应为right+1
}
}
2.注意计算middle时不要用/,用右移符号>>来表示除法。
int middle = (left + right) >> 2;
题源: 力扣