题目
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 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
解题思路
使用二分法
左闭右闭
我们定义target是在一个左闭右闭的区间里,也就是[left, right]。 如果 target 在左区间,即 target < nums[middle],right = middle -1 如果 target 在右区间,即 target > nums[middle],left = middle +1 如果 target == nums[middle],返回 middle 分别处理如下四种情况
-
目标值在数组所有元素之前 -----> [left, right] = [0, -1]
-
目标值等于数组中某一个元素 -----> return middle;
-
目标值插入数组中的位置 [left, right] -----> return right + 1
-
目标值在数组所有元素之后的情况 [left, right], 因为是右闭区间,所以 -----> return right + 1
代码实现
public class Question35 {
public static int searchInsert(int[] nums, int target) {
int left = 0;
int right = nums.length - 1;
while (left <= right) {
int mid = left + ((right - left) / 2);
if (nums[mid] > target) {
right = mid - 1;
} else if (nums[mid] < target) {
left = mid + 1;
} else {
return mid;
}
}
return right + 1;
}
public static void main(String[] args) {
int[] array = new int[]{-1, 0, 3, 5, 9, 12};
System.out.println(searchInsert(array, 2));
}
}