快轉到主要內容
leetcode 153 - Find Minimum in Rotated Sorted Array

leetcode 153 - Find Minimum in Rotated Sorted Array

·
類別 
Leetcode
標籤 
Java Leetcode Medium Array Problem Binary Search Problem Blind75
Eason Chiu
作者
Eason Chiu
一個不做筆記就容易忘記的工程師
目錄

題目
#

leetcode 153 - Find Minimum in Rotated Sorted Array (題目說明請點連結)

題目簡述
#

給一個可能經過旋轉的升序排序陣列 nums,其中所有元素都是唯一的,請找出陣列中的最小值
注意:陣列可能經過 0 次或多次旋轉,旋轉操作會將陣列的最後幾個元素移到陣列的前面。

範例
#

Example 1:

Input: nums = [3,4,5,1,2]
Output: 1
Explanation: 原始陣列 [1,2,3,4,5] 經過 3 次旋轉後變成 [3,4,5,1,2],最小值為 1。

Example 2:

Input: nums = [4,5,6,7,0,1,2]
Output: 0
Explanation: 原始陣列 [0,1,2,4,5,6,7] 經過 4 次旋轉後變成 [4,5,6,7,0,1,2],最小值為 0。

Example 3:

Input: nums = [11,13,15,17]
Output: 11
Explanation: 陣列沒有經過旋轉,保持升序排序,最小值為 11。

解題思路
#

這題要求我們在一個可能經過旋轉的升序排序陣列中找到最小值。我們可以使用二分搜尋來解決這個問題,通過比較中間元素和右邊界元素來決定搜尋的方向。

解法
#

  1. 使用二分搜尋,維護左右邊界 leftright
  2. 計算中間位置 mid
  3. 比較 nums[mid]nums[right]
  4. 如果 nums[mid] < nums[right],最小值在左半部分
  5. 如果 nums[mid] > nums[right],最小值在右半部分
  6. left == right 時,找到最小值

步驟
#

  • 初始化:
    • 設定 left = 0right = nums.length - 1
  • 二分搜尋:
    • left < right 時,繼續搜尋
    • 計算中間位置 mid = left + (right - left) / 2
  • 比較元素:
    • 如果 nums[mid] < nums[right],最小值在左半部分,設定 right = mid
    • 如果 nums[mid] > nums[right],最小值在右半部分,設定 left = mid + 1
  • 返回結果:
    • left == right 時,返回 nums[left]

例子說明
#

nums = [3,4,5,1,2]

步驟 left right mid nums[mid] nums[right] 比較結果 更新邊界
初始化 0 4 - - - - -
第 1 步 0 4 2 5 2 5 > 2 left = 3
第 2 步 3 4 3 1 2 1 < 2 right = 3
第 3 步 3 3 - - - left == right 結束

最終結果: 1

二分搜尋過程說明:

  • 步驟 1mid = 2nums[2] = 5nums[4] = 2,因為 5 > 2,所以最小值在右半部分,left = 3
  • 步驟 2mid = 3nums[3] = 1nums[4] = 2,因為 1 < 2,所以最小值在左半部分,right = 3
  • 步驟 3left == right == 3,找到最小值 nums[3] = 1

完整程式碼
#

java
class Solution {
    public int findMin(int[] nums) {
        // 初始化左右邊界
        int left = 0, right = nums.length - 1;

        // 二分搜尋,當 left == right 時找到最小值
        while(left < right){
            // 計算中間位置,避免整數溢位
            int mid = left + (right - left) / 2;

            // 比較中間元素和右邊界元素
            if(nums[mid] < nums[right]){
                // 如果中間元素小於右邊界元素,最小值在左半部分
                right = mid;
            } else {
                // 如果中間元素大於右邊界元素,最小值在右半部分
                left = mid + 1;
            }
        }

        // 返回最小值
        return nums[left];
    }
}

時間複雜度
#

  • 時間複雜度O(log n),其中 n 是陣列的長度
    • 使用二分搜尋,每次迭代將搜尋範圍減半
  • 空間複雜度O(1),只使用了常數個額外變數
    • 不需要額外的資料結構來儲存中間結果

相關文章

leetcode 128 - Longest Consecutive Sequence
類別 
Leetcode
標籤 
Java Leetcode Medium Array Problem Blind75
leetcode 152 - Maximum Product Subarray
類別 
Leetcode
標籤 
Java Leetcode Medium Array Problem Blind75
leetcode 238 - Product of Array Except Self
類別 
Leetcode
標籤 
Java Leetcode Medium Array Problem Blind75