搜索插入位置
搜索插入位置
题目链接
题目描述
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
请必须使用时间复杂度为 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
题目解法
nums[pos−1] < target ≤ nums[pos]
如果存在这个目标值,我们返回的索引也是 pos,因此我们可以将两个条件合并得出最后的目标:「在一个有序数组中找第一个大于等于 target 的下标」。
问题转化到这里,直接套用二分法即可,即不断用二分法逼近查找第一个大于等于 target 的下标 。n 初值设置为数组长度可以省略边界条件的判断,因为存在一种情况是target 大于数组中的所有数,此时需要插入到数组长度的位置。
public static int searchInsert(int[] nums, int target) {
int left = 0;
int right = nums.length - 1;
int n = nums.length;
while (left <= right) {
int min = (left + right) / 2;
if(nums[min] >= target) {
//找到了把下标复制给n
n = min;
right = min - 1;
}else {
left = min + 1;
}
}
return n;
}