用Java实现二分查找

二分查找,也称折半查找,是一种效率较高的查找算法。其思路是将要查找的区间不断缩小,直到找到目标元素或确定目标元素不存在。

具体实现过程如下:

1. 确定要查找的区间[left, right],初始时为整个数组或列表;

2. 计算区间中间位置mid,取值为(left + right) // 2;

3. 判断目标元素target与中间元素arr[mid]的大小关系:

    - 若target == arr[mid],则找到目标元素,返回mid;
    
    - 若target > arr[mid],说明目标元素在[mid + 1, right]区间内,将left更新为mid + 1,继续执行步骤2;
    
    - 若target < arr[mid],说明目标元素在[left, mid - 1]区间内,将right更新为mid - 1,继续执行步骤2;
    
4. 若区间[left, right]缩小为0,仍未找到目标元素,说明目标元素不存在,返回-1。

下面用Java展示代码:

首先使用一个if语句判断当target不在区间范围内,没有查询到,则返回-1。

 

然后定义一个left和一个right 。

 

 使用while循环的时候一定要注意区间问题,在二分查找中有两种解决方法,其中有分区间为[left,right]和[left,right),这两种方法分别是左闭右闭和左闭右开,而两种方法的区别就在于判断left是否等于right,但在左闭右闭的情况下就必须要left=right,左闭右开就只需要left<right就可以了。定义一个mid,其中>>1在Java中表示除以2的意思,向左偏移了2^1,如果像向右偏移,则用<<1,然后使用if语句进行判断,如果找找到对应元素1,则返回mid,如果nums[mid]>target,则范围会在[left,mid-1],如果nums[mid]<target,则范围会在[mid+1,right]。

 

最后代码如下:

class Solution {
    public int search(int[] nums, int target) {
     if(target<nums[0] && target>nums[nums.length-1]){
         return -1;
     }

     int left = 0;
     int right = nums.length - 1;

     while(left<=right){
         int mid = left +((right-left) >>1 );
         if(nums[mid]==target)
          return mid;
    else if(nums[mid]<target)
         left = mid + 1;
    else if(nums[mid]>target)
         right = mid -1;
     }

     return -1;
    }
}

                                                                                                               文中图片来自@代码随想录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值