二分查找(Java)

文章详细探讨了二分查找中区间的选择,区分了[left,right]和[left,right)两种情况。在左闭右闭区间,left=right是有意义的;而在左闭右开区间,left不会等于right。根据区间类型调整while循环条件和指针更新策略,以确保查找的准确性。
摘要由CSDN通过智能技术生成

二分查找的难点在于,确定查找的区间。
我到底是在[left,right]中查找,还是在[left,right)中查找呢?
while循环中的条件到底是left<=right呢,还是left<right.

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

今天搞明白了!
二分查找的用法有两种。

第一种是在[left,right]也就是左闭右闭区间中查找。(上边代码演示的那种)个人喜欢使用,因为不容易乱
在这种情况下,left=right是有意义的。因此,我们就需要把while循环里边的条件设置成left<=right.
相应地,因为left=right有意义,所以mid有取到left和right的可能。所以查找区间更新时需要将mid设置为left = mid+1或right=mid-1。
第二种是在[left,right)也就是左闭右开区间中查找。
在这种情况下,left=right是没有意义的,因为区间取不到right。所以,我们需要把while循环里边的条件设置为left<right.
相应地,因为left不会等于right,所以mid永远取不到right。所以查找区间更新时需要将mid设置为left=mid或right=mid。
比如,当前数组arr[mid]等于target时,直接返回mid。
当前数组arr[mid]<target时,表明需要去[left,right)的右半部分查找,那么就需要把左指针left往右移动。又因为查找区间是左闭右开的,left是可以取到的。mid这个位置已经验证过arr[mid]<target,所以mid这个位置没有再查的必要。所以把left=mid+1。
当前数组arr[mid]>target时,表明需要去[left,right)的左半部分查找,那么需要把右指针right向左移动。又因为查找区间是左闭右开的,right是取不到的。 所以就可以让right=mid,因为right这个位置在查找时是取不到的,所以mid这个位置也是娶不到的。

有点乱,全当自己捋一下思路。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值