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

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

35Search Insert PositionBinary SearchEasyBinary Search

給定一個排序好的整數陣列 nums(不含重複值)和一個目標值 target,找到目標值在陣列中的索引。如果不存在,回傳它應該被插入的位置,使陣列維持有序。

Example:

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

Intuition

TIP

找到第一個大於等於 target 的位置,就是插入點。

Approaches

1. Linear Scan — O(n) / O(1)
  • Idea: 從左往右掃描,找到第一個 >= target 的位置
  • Time: O(n)
  • Space: O(1)
Linear Scan Code
class Solution {
    fun searchInsert(nums: IntArray, target: Int): Int {
        for (i in nums.indices) {
            if (nums[i] >= target) return i
        }
        return nums.size
    }
}
⭐ 2. Binary Search — O(log n) / O(1)
  • Idea: 使用二分搜尋找到第一個 >= target 的位置(lower bound)
  • Time: O(log n)
  • Space: O(1)
class Solution {
    fun searchInsert(nums: IntArray, target: Int): Int {
        var left = 0
        var right = nums.size
        while (left < right) {
            val mid = left + (right - left) / 2
            if (nums[mid] < target) {
                left = mid + 1
            } else {
                right = mid
            }
        }
        return left
    }
}

WARNING

注意 right 初始值為 nums.size(不是 nums.size - 1),因為插入位置可能在陣列最末端之後。

🔑 Takeaways

Ladders 看全部 →

🔍

二分搜尋進階

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

  1. 1#704Binary SearchEasy有序陣列的基本二分模板
  2. 2
  3. 3#33Search in Rotated Sorted ArrayMedium旋轉排序陣列中找目標
  4. 4#81Search In Rotated Sorted Array IIMedium旋轉陣列含重複 → 處理邊界相等
  5. 5#153Find Minimum in Rotated Sorted ArrayMedium找旋轉陣列的最小值
  6. 6