1. 程式人生 > 實用技巧 >尋找旋轉排序陣列中的最小值

尋找旋轉排序陣列中的最小值

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];
}