二分查找算法

55 阅读1分钟

二分查找

leetcode.cn/problems/se…

精确取值

    public static int binarySearch(int[] nums,int target,int left, int right) {
        //这里需要注意,循环条件
        while (left <= right) {
            //这里需要注意,计算mid
            int mid = left + ((right - left) >> 1);
            if (nums[mid] == target) {
                return mid;
            }else if (nums[mid] < target) {
                //这里需要注意,移动左指针
                left  = mid + 1;
            }else if (nums[mid] > target) {
                //这里需要注意,移动右指针
                right = mid - 1;
            }
        }
        //没有找到该元素,返回 -1
        return -1;
    }

计算下边界( <= [ )

int lowerBound(int[] nums, int target) {
        int left = 0, right = nums.length - 1;
        while (left <= right) {
            //这里需要注意,计算mid
            int mid = left + ((right - left) >> 1);
            if (target <= nums[mid]) {
                //当目标值小于等于nums[mid]时,继续在左区间检索,找到第一个数
                right = mid - 1;
            }else if (target > nums[mid]) {
                //目标值大于nums[mid]时,则在右区间继续检索,找到第一个等于目标值的数
                left = mid + 1;
            }
        }
        return left;
    }
int upperBound(int[] nums, int target) {
        int left = 0, right = nums.length - 1;
        while (left <= right) {
            //求mid
            int mid = left + ((right - left) >> 1);
            //移动左指针情况
            if (target >= nums[mid]) {
                 left = mid + 1; 
            //移动右指针情况
            }else if (target < nums[mid]) {
                right = mid - 1;
            }
            
        }
        return left;
    }