剑指offer 6 旋转数组的最小数字

本文介绍了一种利用二分法思想在旋转数组中寻找最小元素的方法。通过对比中间元素与数组右端点的关系,实现了有效的区间缩小,最终定位到最小值。文章详细解释了选择右端点作为目标值的原因,并给出了Java实现代码。
摘要由CSDN通过智能技术生成

采用二分法的思想

  • 采用二分法,主要是mid与一个target比较,普通的二分查找target是给出来的,但有时没有明确的target,比如这道题,这时一般选择端点当作target,即lr

  • 端点的选择问题:对与这道题,应该选择r,如图所示,倾斜的实线代表序列上升的趋势。
    在这里插入图片描述

    • 选择r

      当mid>r时,显然寻找的min在mid右边。所以区间放缩:l=mid+1

      当mid<r时,min可能在mid的左边,但min也可能就是mid(因为min也小于r),所以区间放缩为:r=mid

      当mid=r时,注意到序列非减,即存在mid到r全部相等的情况,这时min应在mid左边,也或者min=mid=……=r。所以这里也放缩为r = mid

    • 选择l:

      事实上,选择l时走不通的,我刚开始就是选择的l,然后写的心力憔悴也过不了。

      还是如上图所示:当mid>l时,特殊情况下,min在mid左边, 一般情况下 min 在mid右边,这就导致在进行放缩时无法采用相同的策略,也就无法简单的使用循环二分来解题了。

代码:
import java.util.ArrayList;
public class Solution {
    public int minNumberInRotateArray(int [] array) {
        if(array.length==0)return 0;
        int l=0,r=array.length-1;
        while(l<r){
            int mid = (l+r)>>1;
            if(array[mid]<=array[r])r=mid;
            else l=mid+1;
        }
        return array[l];
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

fuckguidao

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值