二分查找又死循环了?讲透三种写法

136 阅读1分钟

用一个经典的题目来讲解二分查找:
给你一个按照非递减顺序排列的整数数组 nums,和一个目标值 target, 你找出给定目标值在数组中的开始位置。

image.png

image.png

    int search(int[] nums, int target){
        int l = 0;
        int r = nums.length - 1;
        while(l <= r){
            int mid = (l + r) / 2;
            if(nums[mid] >= target){
                r = mid - 1;
            } else {
                l = mid + 1;
            }
        }
        return l; // 或者 r + 1
    }

image.png

    int search(int[] nums, int target){
        int l = 0;
        int r = nums.length;
        while(l < r){
            int mid = (l + r) / 2;
            if(nums[mid] >= target){
                r = mid;
            } else {
                l = mid + 1;
            }
        }
        return l; // 或者 r
    }

image.png

    int search(int[] nums, int target){
        int l = -1;
        int r = nums.length;
        while(l + 1 < r){
            int mid = (l + r) / 2;
            if(nums[mid] >= target){
                r = mid;
            } else {
                l = mid;
            }
        }
        return l + 1; // 或者 r
    }