目录
如果目标值不存在于数组中,返回它将会被按顺序插入的位置,也就是为什么最后要返回left?
题目:力扣第35题
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
请必须使用时间复杂度为
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
解法:二分查找
关键词: 有序 搜索 => 二分查找
class Solution { public int searchInsert(int[] nums, int target) { int left = 0; int right = nums.length - 1; int middle = 0; //左闭右闭 while (left <= right) { //防止在(right + left)时溢出 middle = left+ ((right - left) >> 1); if(nums[middle] > target) { // right = middle; right = middle - 1; }else if(nums[middle] < target) { // left = middle + 1; left = middle + 1; }else { return middle; } } return left; } }
重点!!
如果目标值不存在于数组中,返回它将会被按顺序插入的位置,也就是为什么最后要返回left?
我们知道二分查找是一个左右不断逼近的过程,
假如我们找到了target时 那么一定是 left <= target <= right,
之后,一定会跳出循环,在进行最后一次循环时之后 left>=right 也就是left + 1,
那么最后一次循环 target >= left + 1 这里就是最接近的位置
这只是找到了target的情况,
没有找到target的情况,只是直接跳出了循环,少了返回return middle这一步而已
所以我们最后返回left,就是我们要插入的位置
注:转载请注明出处