吃透二分法的模板解法(适合所有类似于二分的算法题)

发布于:2025-07-09 ⋅ 阅读:(13) ⋅ 点赞:(0)
寻找一个有序数组中>=第一个大于某个数的位置:

左端点和右端点都是闭区间的做法[left,right]:

退出循环时候如上图:

    //寻找一个有序数组中>=第一个大于某个数的位置,闭区间[left,right]
    public int binarysort(int[] nums,int target){
        int left=0,right=nums.length-1;
        while(left<=right){
            //防止溢出
            int middle=left+(right-left)/2;
            if(nums[middle]<target){
                left=middle+1;//[middle+1,right]
            }else {
                right=middle-1;//[left,middle-1]
            }
        }
        return left;
    }

左端点是闭区间,右端点是开区间的做法[left,right):

退出循环时候如右图:

    //寻找一个有序数组中>=第一个大于某个数的位置(左闭右开区间[left,right))
    public int binarysort1(int[] nums,int target){
        int left=0,right=nums.length;
        while(left<right){
            //防止溢出
            int middle=left+(right-left)/2;
            if(nums[middle]<target){
                left=middle+1;//[middle+1,right)
            }else {
                right=middle;//[left,middle)
            }
        }
        return left;//or return right
    }

左端点是开区间,右端点是开区间的做法(left,right):

退出循环时候如右图:

    //寻找一个有序数组中>=第一个大于某个数的位置(左闭右开区间(left,right))
    public int binarysort2(int[] nums,int target){
        int left=-1,right=nums.length;
        while(left+1<right){
            //防止溢出
            int middle=left+(right-left)/2;
            if(nums[middle]<target){
                left=middle+1;//(middle,right)
            }else {
                right=middle;//(left,middle)
            }
        }
        return right;
    }

其他类型题目转换:

对于其他四种解释如下

1.大于等于8第一个位置上面已经详细解释。

2.大于8的第一个位置等价于大于等于9的第一个位置。

3.小于8的最后一个位置可以等价于大于等于8的第一个位置再减去1.

4.小于等于8的最后一个位置可以等价于大于等于9的第一个位置再减去1.


网站公告

今日签到

点亮在社区的每一天
去签到