尋找旋轉有序陣列的最小值
阿新 • • 發佈:2018-12-22
假設按照升序排序的陣列在預先未知的某個點上進行了旋轉。
( 例如,陣列 [0,1,2,4,5,6,7]
可能變為 [4,5,6,7,0,1,2]
)。
請找出其中最小的元素。
你可以假設陣列中不存在重複元素。
示例 1: 輸入: [3,4,5,1,2] 輸出: 1
示例 2: 輸入: [4,5,6,7,0,1,2] 輸出: 0
思路:使用二分查詢
首先要判斷這個有序陣列是否旋轉了,通過比較第一個和最後一個數的大小,如果第一個數小,則沒有旋轉,直接返回這個數。如果第一個數大,就要進一步搜尋。我們定義left和right兩個指標分別指向開頭和結尾,還要找到中間那個數,然後和left指的數比較,如果中間的數大,則繼續二分查詢右半段陣列,反之查詢左半段。終止條件是當左右兩個指標相鄰,返回小的那個。
public int findMin(int[] nums) { int left = 0; int right = nums.length - 1; while(nums[left] > nums[right]){//陣列為旋轉陣列 while(left != (right - 1)){ int mid = (left + right) / 2; if(nums[left] < nums[mid]){ left = mid; }else{ right = mid; } } return Math.min(nums[left], nums[right]); } return nums[0]; }