面试题十一:旋转数组的最小数字

把一个有序数组前面若干个数搬到后面,求数组中最小值
方法一:顺序查找最小值 O(n)
方法二:利用该序列的特殊性,使用二分查找

static   int min(int [] array){
        if(array==null||array.length<=0){
            return -1;
        }
        int L=0;
        int R=array.length-1;
        int index=L;  //防止第一个数就是最小的情况
        while( array[index]>=array[R])
        //旋转后的特性,第一个比最后一个大,否则第一个最小
        {
            if(R-L==1){
                index=R;
                break;
            }
            index=(L+R)>>1;
            //如果三值相同则无法判断,只能顺序查找
            if(array[L]==array[R]&&array[L]==array[index]){
                int Min=array[L];
                for(int i=L;i<=R;i++){
                    if(array[i]<Min)
                        Min=array[i];
                }
                return array[Min];
            }
            //否则
            if(array[index]>=array[L]) //左边有序,最小值在右边
                L=index;
            else if(array[index]<=array[R])// 右边有序,最小值在左边
                R=index;

        }
        return array[index];
    }

 

posted @ 2020-03-29 14:26  浪波激泥  阅读(154)  评论(0编辑  收藏  举报