二分法查找算法

本文介绍了二分查找算法的思想,包括左闭右闭和左闭右开两种形式的实现。通过示例展示了Java代码实现,并提到了在LeetCode第704题中的应用。
摘要由CSDN通过智能技术生成

二分查找算法

思想

二分法:即将一个完整的个体分成两份,即中间取名为mid,左边为left,右边为right。然后将需要查找的数与mid对比,如果大于,则让left=mid,再次从中间取名mid,再次比较,以此往复,直到找完为止,同理需要查找的数小于mid也一样,只不过这次变得是right=mid。

二分法查找有两种形式:

第一种为左闭右闭型,即数值可以从两边判断/获取。

第二种为左闭右开型,即数值只可以从左边判断/获取。最右边的取不到。

第一种

public int search(int[] nums, int target) {
        //二分查找
        //左闭右闭区间
        if(target<nums[0]||target>nums[nums.length-1]){
            return -1;//如果target 不在数组范围之内则返回-1 表示没有找到
        }
        int left = 0,rigth = nums.length-1; // 定义target在左闭右闭的区间里,[left, right]
        while (left<=rigth){// 当left==right,区间[left, right]依然有效,所以用 <=
            //每次mid为left和right中间位置 即left+(right-left)/2 这里采用位运算
            int mid=left+((rigth-left)>>1);// 防止溢出 等同于(left + right)/2
            //这里就会有三种情况 等于 大于 小于
            if(nums[mid]==target){
                return mid;// 数组中找到目标值,直接返回下标
            }
            if(nums[mid]<target){// target 在右区间,所以[middle + 1, right]
                left = mid+1;
            }
            if(nums[mid]>target){ // target 在左区间,所以[left, middle - 1]
                rigth = mid-1;
            }
        }
        //当在范围内没有找到,就返回-1
        return -1;
    }

第二种

public int search_back(int[] nums, int target) {
        //二分查找 左闭右开
        if(target<nums[0]||target>nums[nums.length]){
            return -1;//如果target 不在数组范围之内则返回-1 表示没有找到
        }
        int left = 0,right = nums.length;// 定义target在左闭右开的区间里,即:[left, right)
        while (left<right){// 因为left == right的时候,在[left, right)是无效的空间,所以使用 <
            int mid = left+((right-left)>>1);
            if(nums[mid]==target){
                return mid;// 数组中找到目标值,直接返回下标
            }else if(nums[mid]<target){
                left = mid+1; // target 在右区间,在[middle + 1, right)中
            }else if(nums[mid]>target){
                right = mid; // target 在左区间,在[left, middle)中
            }
        }
        // 未找到目标值
        return -1;
    }

以上就是两种二分法查找算法。

可以参考力扣第704题进行运用计算。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值