描述
给定一个排序数组和一个目标值,如果在数组中找到目标值则返回索引。如果没有,返回到它将会被按顺序插入的位置。
注意
你可以假设在数组中无重复元素。
样例
[1,3,5,6],5 → 2
[1,3,5,6],2 → 1
[1,3,5,6], 7 → 4
[1,3,5,6],0 → 0
分析
- 二分法即可,需要注意的是在数组中找不到target的时候,如何确定正确的插入位置
我的代码中,出while循环时,left和right满足关系是:left = right +1,
按照题目要求,返回的位置是向后插入元素,所以直接返回left即可 - 我这里处理了数组中有重复元素的情况,所以是两个while循环
代码
public int searchInsert(int[] array, int target) {
if (1 > array.length) {
return 0;
}
int left = 0;
int right = array.length - 1;
int index = 0;
while (left <= right) {
int mid = (right + left) / 2;
if (target > array[mid]) {
// 命中右区间,更新左端点
left = mid + 1;
} else if (target < array[mid]) {
// 命中左区间,更新右端点
right = mid - 1;
} else {
// mid命中,查找左区间的第一个出现的位置
while (mid - 1 >= 0 && array[mid - 1] == array[mid]) {
mid = mid - 1;
}
return mid;
}
}
return left;
}