旋转数组的最小数字_java

  • 题目描述

把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。

  • 题目解析
    • 二分查找法使时间复杂度O(n)降为O(logN)
import java.util.ArrayList;
public class Solution {
    public int minNumberInRotateArray(int [] array) {
     if(array.length == 0)
            return 0;
        int low = 0;
        int high = array.length - 1;
        //旋转数组为排序数组本身的特例
        int mid = low;
        while(array[low]>= array[high]){
            // 分界点
            if(high - low == 1){
                mid = high;
                break;
            }
            mid = (high + low) / 2;
            //两侧数字和中间数字相同的特殊情况
            if(array[low]== array[high] && array[mid]== array[low]){
                return MinInOrder(array,low,high);
            }
            if(array[mid] >= array[low]){
                low = mid;
            }else if(array[mid] <= array[high]){
                high = mid;
            }
        }
        return array[mid];
    }
    
    private int MinInOrder(int[] array,int low,int high){
        int result = array[low];
        for(int i = low +1;i<high;i++){
            if(result> array[i]){
                result = array[i];
            }
        }
        return result;
    }  
}

你可能感兴趣的:(算法题解)