关于二分查找

最近开始刷LeetCode,第一天就是二分查找,说是简单题型,但对于我这样一个平时不练习,期末靠背的混子来说,简直难的不要不要的。所以我先给大家一个建议哈,那就是多刷题多总结

废话不多说。

我们知道,二分查是通过一个中间下标mid来与目标值进行比较,如果中间下标所在值比目标值小,那么目标值在mid左边,如果中间下标比目标值大,那么目标值在mid右边,否则,正好是目标值。

在这里插入图片描述
有一个有序数组 int[] arr = {-1,3,6,9,11}
目标值是 target = 9
我们定义三个指针(其实不是指针,就是下标,这么描述是为了方便理解)
low = 0, high = 4, mid = low + (high - low) / 2(这么做是防止整数溢出),
第一遍循环开始,arr[mid]=6,比target小,这时候我们就要将左指针low变成mid+1也即3(为什么不是mid呢?因为9比6大,6不是我们需要的,所以要后移一位),这时候第一遍循环已经结束。
第二遍循环重新计算一下mid=3,那么arr[mid]=9,已经找到了,直接返回mid即可。
如果找不到,就返回-1。
循环的结束条件就是low <= high(这里需要等于,因为查找的可能是数组边界值,只有[low,high]闭区间才能包含这个边界值)
下面附上代码:

public class BinarySearch {
    public static void main(String[] args) {
        int[] nums = {-1,3,3,5,9,12};
        int target = 12;
        System.out.println(search(nums,target));
    }

    private static int search(int[] nums, int target) {
        int low = 0, high = nums.length - 1;
        while (low <= high){
            int mid = low + (high - low) / 2;
            if (target > nums[mid]){//目标值比中间值大
                low = mid + 1;
            }
            else if(target < nums[mid]){//目标值比中间值小
                high = mid - 1;
            }
            else return mid;//一样大就返回下标
        }
        return -1;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值