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

来源:互联网 发布:在app里找淘宝官方客服 编辑:程序博客网 时间:2024/05/01 13:51

把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。

建议读者自己思考以后再看答案
废话不多说,看代码:

public class MinNumberInRotateArray {     public static int minNumberInRotateArray(int [] arr) {            int low = 0;            int high = arr.length-1;            int mid = low;            if(arr==null||arr.length == 0){                return -1;            }            //用到了快排的思想            while(low<=high){                mid = (low+high)/2;                if (arr[low]==arr[high]&&arr[mid] == arr[high]){                    //针对{1,0,1,1,1}这种情况要遍历                    return traverseArray(arr);                   }                if (arr[low]<arr[high]) {                    //针对{1,2,2,2,2}这种完全翻转的情况要遍历                    return traverseArray(arr);                   }                if(high-low==1){                    mid = high;                    return arr[mid];                }                if(arr[mid]>=arr[low]){                   //mid仍在左数组                    low = mid;                }else{                    high = mid;                   }            }            return arr[0];        }        /**         * 遍历数组(在特殊情况下要用到)         * @param arr         * @return         */        public static int traverseArray(int[] arr){            int min = arr[0];            for(int i =0;i<arr.length;i++){                if(min>arr[i]){                    min = arr[i];                }            }            return min;        }        public static void main(String[] args){            int[] arr = {1,0,1,1,1};            System.out.println(minNumberInRotateArray(arr));        }}
0 0
原创粉丝点击