劍指offer 旋轉陣列的最小數字 java程式碼
阿新 • • 發佈:2019-01-02
題目描述
把一個數組最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。 輸入一個非遞減排序的陣列的一個旋轉,輸出旋轉陣列的最小元素。 例如陣列{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。
最最最麻煩的是
- 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];
}
}