《劍指offer》系列 旋轉陣列的最小數字(Java)
阿新 • • 發佈:2019-01-09
連結
題目描述
把一個數組最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。 輸入一個非減排序的陣列的一個旋轉,輸出旋轉陣列的最小元素。 例如陣列{3,4,5,1,2}為{1,2,3,4,5}的一個旋轉,該陣列的最小值為1。 NOTE:給出的所有元素都大於0,若陣列大小為0,請返回0。
思路
找到最小數字通常只需遍歷一遍陣列就可以,時間複雜度是O(n)。
這裡肯定不能這樣做,因為沒有利用到旋轉陣列的特性,根據觀察,最小值其實是陣列前後兩部分的分界,而這兩部分都是有序的,可以利用二分查詢的思想進行處理。
程式碼
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) { //左邊比右邊下標為1 時候 找到目標值 mid = high; break; } mid = (low + high) / 2; if (array[mid] >= array[low]) { //當中間值比左邊值大的時候 說明最小值還在後面 low = mid; } else if (array[mid] <= array[high]) { //當中間值比左邊值小的時候 說明最小值在前面 high = mid; } } return array[mid]; } }