二分查找

122 阅读1分钟

二分查找

适用范围:有序数组,无重复元素

704 二分查找

题解一(左闭右闭区间):

class Solution {
    public int search(int[] nums, int target) {
        //获取左边界
        int l = 0;
        //获取右边界
        int r = nums.length - 1;
        //左闭右闭区间,l==r有意义
        while (r >= l) {
            //获取中间索引
            int mid = l + (r - l) / 2;
            /**
            1. target小于中间索引处值,则target处于mid索引的左端(但不等于mid索引处值),即右
            边界更新为mid-1,继续搜索;
            2. target大于中间索引处值,则target处于mid索引的右端(但不等于mid索引处值),即左
            边界更新为mid+1,继续搜索;
            3. target等于中间索引处值,则返回mid,停止搜索。
            **/
            if (nums[mid] > target) {
                r = mid - 1;
            }else if (nums[mid] < target) {
                l = mid + 1;
            }else {
                return mid;
            } 
        }
        //当l>r时,仍未找到target,返回-1
        return -1;
    }
}

题解二(左闭右开区间):

class Solution {
    public int search(int[] nums, int target) {
        //获取左边界
        int l = 0;
        //获取右边界
        int r = nums.length;
        //左闭右闭区间,l==r无意义
        while (r > l) {
            //获取中间索引
            int mid = l + (r - l) / 2;
            /**
            1. target小于中间索引处值,则target处于mid索引的左端(但不等于mid索引处值),右边
            界为开区间,即右边界更新为mid,继续搜索;
            2. target大于中间索引处值,则target处于mid索引的右端(但不等于mid索引处值),即左
            边界更新为mid+1,继续搜索;
            3. target等于中间索引处值,则返回mid,停止搜索。
            **/
            if (nums[mid] > target) {
                r = mid;
            }else if (nums[mid] < target) {
                l = mid + 1;
            }else {
                return mid;
            } 
        }
        //当l>r时,仍未找到target,返回-1
        return -1;
    }
}