1. 题目
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
请必须使用时间复杂度为 O(log n) 的算法。
示例一:
输入: nums = [1,3,5,6], target = 5输出: 2
示例二:
输入: nums = [1,3,5,6], target = 2输出: 1
示例三:
输入: nums = [1,3,5,6], target = 7
输出: 4
提示:
- 1 <= nums.length <= 104
- -104 <= nums[i] <= 104
- nums 为 无重复元素 的 升序 排列数组
- -104 <= target <= 104
2. 思路
注意:以后大家只要看到面试题里给出的数组是有序且无重复数组,都可以想一想是否可以使用二分法。
这道题目,要在数组中插入目标值,无非是这四种情况
- 目标值在数组所有元素之前
- 目标值等于数组中某一个元素
- 目标值插入数组中的位置
- 目标值在数组所有元素之后
这四种情况确认清楚了,就可以尝试解题了
3. 代码
public int search(int[] array, int target){
int left = 0, right = array.length-1;
int middle = 0;
while (left <= right){
middle = left + ((right - left) >> 1);
if (array[middle] > target){
right = middle - 1;
} else if (array[middle] < target){
left = middle + 1;
} else {
return middle;
}
}
// 分别处理如下四种情况
// 目标值在数组所有元素之前 [0, -1]
// 目标值等于数组中某一个元素 return middle;
// 目标值插入数组中的位置 [left, right],return right + 1
// 目标值在数组所有元素之后的情况 [left, right], return right + 1
return right + 1;
}
