zoukankan      html  css  js  c++  java
  • 面试题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;
        }
    }
  • 相关阅读:
    巨蟒python全栈开发-第3天
    python全栈开发-第1天
    2018.11.23-day28 异常处理&hashlib
    面试题1
    if __name__ == "__main__": 怎么理解?
    2018.11.23-day27 面向对象(大总结)
    2018.11.23-day26 面向对象(终结)
    20181125 test
    (39.1) Spring Boot Shiro权限管理【从零开始学Spring Boot】
    Android一键换肤功能:一种简单的实现
  • 原文地址:https://www.cnblogs.com/Allen-win/p/8097988.html
Copyright © 2011-2022 走看看