旋转数组的最小最小数字

方法来自剑指offer里的解答,其实还有很多其他方法可以使时间复杂度小于O(n),但是这个解法可以利用到数组一部分有序的特性,这样能大大减少时间复杂度,程序使用的方法和二分查找类似,以下是代码

public class Solution {
    public int minNumberInRotateArray(int [] array) {
       int p1=0,p2=array.length-1;
        while((p2-p1)>1){
            int midIndex=(p1+p2)/2;
            if(array[p1]==array[midIndex]&&array[midIndex]==array[p2])
                return inOrder(array,p1,p2);
            if(array[midIndex]<=array[p2])
                p2=midIndex;
            else
                p1=midIndex;
        }
        return Math.min(array[p1],array[p2]);
    }
    public int inOrder(int[] array,int p1,int p2){
        int result=array[p1];
        while(p1<=p2){
            result=Math.min(result,array[p1]);
            p1++;
        }
        return result;
    }
}

猜你喜欢

转载自blog.csdn.net/qq_33605294/article/details/85275520