Medium草稿★★★★★O(log n) 時間 · O(1) 空間
ArrayBinary Search
Patterns🎯 二分搜尋
尚未複習過

解法已隱藏 — 先讀題目敘述、自己想想看,再點上方按鈕揭曉。

153Find Minimum in Rotated Sorted ArrayBinary SearchMediumBinary Search

給定一個原本升序排列但經過若干次旋轉的整數陣列 nums(元素不重複),找出陣列中的最小值。要求時間複雜度為 O(log n)

Example:

Input: nums = [3,4,5,1,2] Output: 1

Intuition

TIP

旋轉後的陣列由兩段有序子陣列組成,最小值在「斷點」處。透過比較 mid 與 right 來判斷最小值在哪一半。

Approaches

1. Linear Scan — O(n) / O(1)
  • Idea: 遍歷陣列找最小值
  • Time: O(n)
  • Space: O(1)
Linear Scan Code
class Solution {
    fun findMin(nums: IntArray): Int {
        var min = nums[0]
        for (num in nums) {
            min = minOf(min, num)
        }
        return min
    }
}
⭐ 2. Binary Search — O(log n) / O(1)
  • Idea: 比較 mid 與 right 來縮小搜尋範圍,找到旋轉的斷點
  • Time: O(log n)
  • Space: O(1)
class Solution {
    fun findMin(nums: IntArray): Int {
        var left = 0
        var right = nums.size - 1
        while (left < right) {
            val mid = left + (right - left) / 2
            if (nums[mid] > nums[right]) {
                left = mid + 1
            } else {
                right = mid
            }
        }
        return nums[left]
    }
}

WARNING

這裡用 left < right(不含等號)配合 right = mid(不是 mid - 1),因為 mid 本身可能就是最小值。如果用 left <= right 會導致無限迴圈。

🔑 Takeaways

Ladders 看全部 →

🔍

二分搜尋進階

從基本模板到旋轉陣列與重複值。

  1. 1#704Binary SearchEasy有序陣列的基本二分模板
  2. 2#35Search Insert PositionEasy找插入位置(lower_bound)
  3. 3#33Search in Rotated Sorted ArrayMedium旋轉排序陣列中找目標
  4. 4#81Search In Rotated Sorted Array IIMedium旋轉陣列含重複 → 處理邊界相等
  5. 5
  6. 6