劍指offer:旋轉陣列的最小數字

weixin_34128411發表於2019-02-23

題目描述

把一個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。 輸入一個非遞減排序的陣列的一個旋轉,輸出旋轉陣列的最小元素。例如陣列{3,4,5,1,2}為{1,2,3,4,5}的一個旋轉,該陣列的最小值為1。

NOTE:給出的所有元素都大於0,若陣列大小為0,請返回0。

題目解析:
暴力遍歷找最小,肯定不是想要考察我們的方式,如何讓步驟更少呢?

  1. 本題和二分查詢一樣,用兩個指標分別指向第一個元素和最後一個元素。

  2. 找到中間的元素。
    1)如果中間元素位於前面的遞增子陣列,那麼它應該大於等於左邊指標指向的元素。此時陣列中最小的元素應該位於該中間元素的後面。可以把左指標指向中間,這樣可以縮小尋找的範圍。
    2)如果中間元素位於後面的遞增子陣列,那麼它應該小於或等於右邊的指標指向的元素。將右指標指向中間位置。此時最小元素位於應該中間元素的左邊。

3.接下來我們再用更新之後的兩個指標,重複做新一輪的查詢。

import java.util.ArrayList;
public class Solution {
    public int minNumberInRotateArray(int [] array) {
        if(array.length == 0){
            return 0;
        }
        int left = 0;
        int right = array.length -1;
        int mid = left;
        while( array[left] >= array[right] ){
            if(right - left == 1) {
                return array[right];
            }
            mid = left + (right-left)/2;
            if((array[left] == array[mid]) && (array[left]==array[right])&& (array[right]==array[mid])){
                return minNum(array,left,right);
            } 
            if( array[mid] >= array[left] ){
                left = mid;
            } else if(array[mid] <= array[right]){
                right = mid;
            }
        }
        return array[mid];
    }
    
     public static int minNum(int [] arr,int left,int right){
        int min = arr[left];
        for(int i = left+1; i<= right; i++){
            if(arr[i] < min){
                min = arr[i];
            }
        }
        return min;
    }
}

相關文章