面试题11:旋转数组中的最小数字

 

第一个指针总是指向前面递增数组中的元素,第二个指针总是指向后面递增数组中的元素。最终,第二个指针刚好指向的是最小的元素。

用二分法,时间复杂度:O(logn)。

考虑到足够多的测试用例:

{5,6,7,8,9,1,2,3,4}   {2}  {3,2}   {1,2,3,4}   {1,1,0,1,1,1,1,1,1,1}

 

/**
 * @Name:Allen
 * @Description:
 */
public class MinNumInRevertArr11 {
    public static void main(String[] args){
        int[] arr={1,0,1,1,1,1};
        Solution11 solution = new Solution11();
        System.out.print(solution.solve(arr));
    }
}

class Solution11{
    int solve(int[] arr){
        if(arr==null || arr.length==0){
            throw new RuntimeException("array is empty");
        }
        int begin=0,end=arr.length-1;
        int result=arr[begin];//如果一开始就是递增的数组,旋转的元素个数为0
        int mid=(begin+end)/2;
        while(arr[begin]>=arr[end]){//旋转的元素个数非0
            if(end-begin<=1){//end-begin=1或者0(数组有可能只有一个元素,此时end-begin=0)
                result = arr[end];
                return result;
            }else{
                    //如果出现前后指针指向的数值和mid指向的数值是相等的,采取遍历的方法
                    if(arr[begin]==arr[end] && arr[end]==arr[mid]){
                        return result=findMin(arr,begin,end);
                    }
                    mid=(end+begin)/2;
                    if(arr[mid]>=arr[begin]){
                        begin=mid;
                    }else if(arr[mid]<=arr[end]){
                        end=mid;
                    }
                }
            }
        return result;
    }

    int findMin(int[] arr,int begin,int end){
        int min=arr[begin];
        for(int i=begin+1; i<=end; i++){
            if(arr[i]<min){
                min=arr[i];
            }
        }
        return min;
    }
}

 

posted @ 2017-12-24 14:22  Allen101  阅读(149)  评论(0编辑  收藏  举报