给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
你可以假设数组中无重复元素
示例 1:
输入: [1,3,5,6], 5
输出: 2
示例 2:
输入: [1,3,5,6], 2
输出: 1
示例 3:
输入: [1,3,5,6], 7
输出: 4
示例 4:
输入: [1,3,5,6], 0
输出: 0
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/search-insert-position
解题思路
利用二分法, 定义两个索引, i
指向寻找目标数区间的左边界, j
指向右边界
注意: 如果目标数小于第一个数, 说明要插入索引为0, 如果目标大于最后一个数, 则要插入索引为数组长度
所以初始化int i = 0, j = nums.length
循环判断
- 如果中间的数等于目标, 返回索引
- 如果中间的数小于目标, 则说明要插入的位置在
(mid, j]
(左开右闭), 更新索引i = mid + 1
- 如果中间的数大于目标, 则说明要插入的位置在
[i, mid]
, 更新索引j = mid
最后如果跳出了循环, 返回i
和j`都行, 因为两者都指向了插入位置
代码
class Solution {
public int searchInsert(int[] nums, int target) {
int i = 0, j = nums.length;
while (i < j) {
int mid = (i + j) >> 1;
if (nums[mid] == target) {
return mid;
}
if (nums[mid] < target) {
i = mid + 1;
} else {
j = mid;
}
}
return j;
}
}