Just do it
专注做自己的事,有想做的事就去做好了

经典二分思路:

案例:

有序数组: {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; }

 

posted on 2025-02-23 22:09  Ireck  阅读(19)  评论(0)    收藏  举报