尋找旋轉排序陣列中的最小值
阿新 • • 發佈:2020-11-05
1.問題描述
假設按照升序排序的陣列在預先未知的某個點上進行了旋轉。例如,陣列 [0,1,2,4,5,6,7]
可能變為 [4,5,6,7,0,1,2]
。
請找出其中最小的元素。
示例 1:
輸入:nums = [3,4,5,1,2]
輸出:1
示例 2:
輸入:nums = [4,5,6,7,0,1,2]
輸出:0
示例 3:
輸入:nums = [1]
輸出:1
提示:
1 <= nums.length <= 5000
-5000 <= nums[i] <= 5000
nums
中的所有整數都是 唯一 的nums
原來是一個升序排序的陣列,但在預先未知的某個點上進行了旋轉
2.求解
二分查詢
- 本題要明確的一個要點是最小值一定出現在有旋轉點的那一側
- 那麼每次搜尋我們都需要找到被旋轉的那一側區間,然後比較選擇元素小的那一側區間,那麼可以將這兩個條件合併
nums[mid] < nums[right]
,當此條件符合時,被旋轉區間一定在左側,小的元素也一定在左側 - 終止條件:當搜尋區間大小為1時,停止搜尋,並返回此元素
程式碼如下
/* * 執行用時:0 ms, 在所有 Java 提交中擊敗了100.00% 的使用者 * 記憶體消耗:37.8 MB, 在所有 Java 提交中擊敗了91.78% 的使用者 * */ public int findMin(int[] nums) { int left = 0; int right = nums.length - 1; while(left < right){ int mid = left + (right - left) / 2; if(nums[mid] < nums[right]){ right = mid; }else{ left = mid + 1; } } return nums[left]; }