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

采用二分法的思想

  • 采用二分法,主要是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];
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章