1. 程式人生 > >劍指offer 旋轉陣列的最小數字 java程式碼

劍指offer 旋轉陣列的最小數字 java程式碼

題目描述
把一個數組最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。 輸入一個非遞減排序的陣列的一個旋轉,輸出旋轉陣列的最小元素。 例如陣列{3,4,5,1,2}為{1,2,3,4,5}的一個旋轉,該陣列的最小值為1。 NOTE:給出的所有元素都大於0,若陣列大小為0,請返回0。

思路:旋轉數列可以看做兩個有序序列,前一個遞增序列的最大值位置的下一位,幾位整個數列的最小值的位置。可以採用二分查詢的思路,從中間位置mid入手,array[head] < array[mid] 說明mid進入第一個遞增序列,最小值在mid後面,更新head為mid。array[head] > array[mid] 說明mid處於第二個遞增子序列中,最小值在mid前面,更新rear為mid。
最最最麻煩的是

:arrary[head] == array[mid] == array[rear],此時有三種情形。

  • 1,1,1,1,1,0,1
  • 1,0,1,1,1,1,1
  • 1,1,1,1,1,1,1
    這樣的話,二分查詢就失效了,此時只能採取順序遍歷的方式找最小值了。

演算法中最重要的是: 要想到前一個遞增序列的最大值位置的下一位,幾位整個數列的最小值的位置,即

        if (rear - head == 1) {
                return array[rear];
            }

這個是最後返回的判斷條件。

參考程式碼如下:

import java.util.ArrayList;
public
class Solution { public int minNumberInRotateArray(int[] array) { if (array == null) { return 0; } if (array.length <= 0) { return 0; } return findMin(array, 0, array.length); } public int findMin(int[] array, int head, int rear) { while
(head < rear) { if (rear - head == 1) { return array[rear]; } int mid = (head + rear) / 2; if (array[mid] > array[head]) { head = mid; } else if (array[mid] < array[head]) { rear = mid; } else { int min = array[head]; for (; head < rear; head++) { if (min > array[head+1]) { min = array[head]; } } return min; } } return array[rear]; } }