704.二分查找binarySearch

image.png

思路

  • 二分查找的原理从排好序的数组中,将数组从中间索引处一份为二, 拆分成左右两个子数组进行搜索, 左右两个子数组分别在根据自身中间索引在一份二位, 一直到left和right两个索引相遇时循环结束

先初始化left = 0, 从数组的最左边开始,right = nums.length - 1 从数组的最右边开始
中间索引mid = left + (right - left)/2; 这样是为了防止超大的int值越界
while (left ? right) 循环的条件是left < right 还是left <= right呢, 这其实是根据我们定义的区间是[左闭右闭],还是[左闭右开)来决定
如果是左闭右闭就是 <= , 因为[left, rigt] [1,1] 区间既包含左也包含右, 所以left <= right 1<=1 是合理的
如果是 left < right 假设区间是[1,1] ,那么 left = 1, right = 1, 在这个区间不合理
left < right 的情况是适用于[left, right), [1,1)左闭右开 指的是不包含右区间的数 , 如果left = right 在这个区间里没有意义, 所以left < right
那么在[左闭右开]的情况中, nums[mid] > target 时, 说明target在数组的左边, 我们应该更新左区间的右边界, 因为nums[mid] 肯定不符合左区间的边界,所以right = mid - 1 等于mid的前一个
如果nums[mid] < target 时, 说明target在数组的右边, 应该更新右区间的左边界,nums[mid] < target, mid 肯定不符合右区间的边界, 所以left = mid + 1;
相等直接返回mid
找不到直接返回-1

    // 左闭右闭区间解法, 包含最右边的值
    public int search(int[] nums, int target) {
        int left = 0;
        int right = nums.length - 1;
        int mid = left + (right - left) / 2;
        while (left <= right) {
            if (nums[mid] > target) {
                right = mid - 1;
            } else if (nums[mid] < target) {
                left = mid + 1;
            } else {
                return mid;
            }
        }
        return -1;
    }

    // 左闭右开解法, 不包含最右边的值
    // [left, right) [1,1)
    public int search1(int[] nums, int target) {
        int left = 0;
        int right = nums.length;
        while (left < right) {
            int mid = left + ((right - left) >>1);
            if (nums[mid] > target) {
                right = mid;
            } else if (nums[mid] < target) {
                left = mid + 1;
            } else {
                return mid;
            }
        }
        return -1;
    }

leetcode

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容