经典二分思路:
案例:
有序数组: {1,2,3,4,5,6,7,8,9} 目标target: 9
首先找到数组的中间下标:mid = (start + end)/2 -> (0 + 8)/2 = 4
{1,2,3,4,5,6,7,8,9}
我们的中间值5 < 9,我们把start下标移到mid + 1的位置 5。
重新计算mid 值 -> mid = (start + end)/2 -> (5 + 8)/2 = 6
{1,2,3,4,5,6,7,8,9}
我们的中间值7 < 9,我们把start下标移到mid + 1的位置 7。
重新计算mid 值 -> mid = (start + end)/2 -> (7 + 8)/2 = 7
{1,2,3,4,5,6,7,8,9}
我们的中间值8 < 9,我们把start下标移到mid + 1的位置 8。
重新计算mid 值 -> mid = (start + end)/2 -> (8 + 8)/2 = 8
返回下标结果 8
题解
public int searchInsert(int[] nums, int target) { int len = nums.length; int left = 0; int right = len - 1; int mid = left - ((left - right) >> 1); while(left <= right){ if(nums[mid] > target){ right = mid - 1; }else if(nums[mid] < target){ left = mid + 1; }else { return mid; }
// 因为left + right 可能大小溢出异常
// left - ((left - right)/2) 等价于 left/2 + right/2
// 除2等价于将该数值右移1位 mid = left - ((left - right) >> 1); } return mid; }
浙公网安备 33010602011771号