LeetCode 704 二分查找 Java

发布于:2025-06-16 ⋅ 阅读:(19) ⋅ 点赞:(0)

1.确定区间的定义

写二分法,区间的定义一般为两种,左闭右闭即[left, right],或者左闭右开即[left, right)。

左闭右闭,边界值都能取到,左闭右开,左边界可以取到,右边界取不到

先放代码,相关的描述放在代码里了

class Solution {
    public int search(int[] nums, int target) {
        //左闭右闭区间
        //int left=0,right=nums.length-1;
        // while(left<=right){
        //     int mid=left+(right-left)/2;
        //     if(nums[mid]==target){
        //         return mid;
        //     }
        //     else if(nums[mid]<target){
        //         left=mid+1;
        //     }
        //     else if(nums[mid]>target){
        //         right=mid-1;
        //     }
        // }
        // return -1;

        //左闭右开区间
        int left=0,right=nums.length;
        while(left<right){
            int mid=left+(right-left)/2;
            if(nums[mid]==target){
                return mid;
            }
            else if(nums[mid]<target){
                left=mid+1;
            }
            else if(nums[mid]>target){
                right=mid;
            }
        }
        return -1;
    }
}

2.左闭右闭区间 [left, right]

   左闭右闭区间
        int left=0,right=nums.length-1;//右边界是可以取到的,所以不能为nums.length,这实际超出了数组长度
         while(left<=right){//左右边界可以相等,举个例子[1,1],这是正确的
             int mid=left+(right-left)/2;
             if(nums[mid]==target){
                 return mid;
             }
             else if(nums[mid]<target){
                 left=mid+1;//左边界可以取到,这里排除了mid,所以左边界取mid+1
             }
             else if(nums[mid]>target){
                 right=mid-1;//与上面同理
             }
         }
         return -1;

3.左闭右开区间 [left, right)

//左闭右开区间
        int left=0,right=nums.length;//右边界取不到,这里可以为nums.length
        while(left<right){//左边界能取到,右边界取不到,所以左右边界不能相同,例如[1,1)是不对的
            int mid=left+(right-left)/2;
            if(nums[mid]==target){
                return mid;
            }
            else if(nums[mid]<target){
                left=mid+1;
            }
            else if(nums[mid]>target){
                right=mid;//右边界取不到,排除了mid之后,可以让右边界等于mid
            }
        }
        return -1;

搞清楚区间的能不能取到边界值


网站公告

今日签到

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