剑指offer-旋转数组的最小数

题目描述

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

NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。

public class Test {
    public static void main(String[] args) {
        int[] array = {3,4,5,1,2};
        System.out.println(Test.minNumberInRotateArray(array));
    }
    
    /**
     * 
     * @param array
     * @return
     */
    public static int minNumberInRotateArray(int [] array) {
        if(array.length == 0) return 0;  // 数组长度为0, 返回0
        int left = 0;   // 开始处理的第一个位置
        int right = array.length - 1;   // 开始处理的最后一个位置
        int mid = left;   // 设置初始位置 
        // 确保left在前面排好序的位置,right在后面排好序的位置
        while(array[left] >= array[right]) {
            // 当处理数据只有两个返回后一个结果
            if(right - left == 1) {
                return array[right];
            }
            // 取中间的位置
            mid = (left + right) / 2;
            // 如果三个数相等,顺序查找最小值
            if((array[left] == array[mid]) && (array[left] == array[right]) && (array[mid] == array[right]) ) {
                return minNum(array, left, right);
            } else if(array[left] >= array[mid]) { // 中间数据在后半部分,最小值在当前mid前面
                right = mid;
            } else {  // 中间数据在前半部分,最小值在当前mid后面
                left = mid;
            }
        }
        return array[mid];
    }

    private static int minNum(int[] array, int left, int right) {
        int min = array[left];
        for(int i=left+1; i<=right; i++) {
            if(array[i] < min) {
                min = array[i];
            }
        }
        return min;
    }
}
原文地址:https://www.cnblogs.com/zywu/p/5766221.html