[Java]解析二分查找并利用二分查找寻找旋转数组的最小数字

二分查找:又称折半查找,要求带查找的序列有序(递增或递减的旋转数组也可以)。可以根据字面意思理解二分查找的核心思想就是把数组分区,首先定义一个左指针left(数组第一个元素的下标)和一个右指针right(数组末元素下表),之后计算数组中间位置的指针mid(mid=left+(right-left)/2)进行分区,第一次分区结束后进行判断,假设是一个递增的数组,如果待查关键字大于mid所指的元素则在后半段进行查找,如果小于则在前半段进行查找,此时left=mid或right=mid再进行新一轮的分区直到找到待查关键字。
下面是一个例题:
链接:https://www.nowcoder.com/questionTerminal/9f3231a991af4f55b95579b44b7a01ba?toCommentId=5357527
来源:牛客网
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。
输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。
例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。
NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。

public class Swordquest6 {
    public int minNumberInRotateArray(int [] array) {//原始的方法
        if(array.length==0){
            return 0;
        }
        int key=array[1];
        for(int i= array.length-1;i>0;i--){
            if(array[i]<array[i-1]){
                 key=array[i];
                break;
            }
        }
        return key;
    }
    public int minNumberInRotateArray1(int [] array) {//二分查找
        if(array.length==0){
            return 0;
        }
        int left=0;
        int right=array.length-1;
        int mid=-1;
        while(array[left]>=array[right]){//根据旋转数组的特性 定义好循环条件
              if(right-left==1){
                  mid=right;
                  break;
              }
              mid=left+(right-left)/2; 
              if(array[left]<=array[mid]){
                  left=mid;
              }
              if(array[right]>=array[mid]){
                  right=mid;
              }
        }
        return array[mid];

    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值