劍指offer 11. 旋轉陣列中的最小數
阿新 • • 發佈:2021-01-11
把一個數組最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入一個遞增排序的陣列的一個旋轉,輸出旋轉陣列的最小元素。例如,陣列[3,4,5,1,2] 為 [1,2,3,4,5] 的一個旋轉,該陣列的最小值為1。
示例 1:
輸入:[3,4,5,1,2]
輸出:1
示例 2:
輸入:[2,2,2,0,1]
輸出:0
解題:
class Solution { public int minArray(int[] numbers) { if(numbers.length == 0) return -1; if(numbers.length == 1) return numbers[0]; if(numbers.length == 2) return numbers[0]<numbers[1]?numbers[0]:numbers[1]; int low = 0, high = numbers.length-1; int mid = (low + high) / 2; while(low < high-1){ // 前中後三個下標對應陣列元素相等,不能按照二分法找最小值,只能按順序查詢 if(numbers[low] == numbers[mid] && numbers[mid] == numbers[high]) return InOrder(numbers); //剩餘陣列範圍內已經按從小到大順序排好 if(numbers[low] < numbers[high]) return numbers[low]; //中間陣列元素大於等於低位陣列元素:最小值在後半部分 //中間陣列元素小於等於高位陣列元素:最小值在前半部分 if(numbers[mid] >= numbers[low]) low = mid; else high = mid; mid = (low + high) / 2; } return numbers[high]; } public int InOrder(int[] numbers){ int i=0; while(i<numbers.length-2){ if(numbers[i] <= numbers[i+1]) i++; else break; } return numbers[i+1]; } }