Medium草稿★★★★O(n) 時間 · O(1) 空間
Sliding WindowArrayBinary Search
Patterns🪟 滑動視窗🎯 二分搜尋
尚未複習過

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

209Minimum Size Subarray SumSliding WindowMediumSliding Window

給定正整數陣列 nums 和正整數 target,回傳和 >= target 的最短連續子陣列長度。若不存在則回傳 0。

Example:

Input: target = 7, nums = [2,3,1,2,4,3] Output: 2(子陣列 [4,3] 和為 7)

Intuition

TIP

核心思路:可變大小滑動視窗,右指針擴展累加總和,當總和 >= target 時嘗試收縮左邊界找最短長度。

Approaches

1. Brute Force — O(n²) / O(1)
  • Idea: 嘗試所有起點,向右累加直到 >= target
  • Time: O(n²)
  • Space: O(1)
Brute Force Code
class Solution {
    fun minSubArrayLen(target: Int, nums: IntArray): Int {
        var result = Int.MAX_VALUE
        for (i in nums.indices) {
            var sum = 0
            for (j in i until nums.size) {
                sum += nums[j]
                if (sum >= target) {
                    result = minOf(result, j - i + 1)
                    break
                }
            }
        }
        return if (result == Int.MAX_VALUE) 0 else result
    }
}
⭐ 2. Sliding Window (variable size) — O(n) / O(1)
  • Idea: 維護視窗總和,右指針擴展、左指針收縮
  • Time: O(n) - 左右指針各最多遍歷 n 次
  • Space: O(1)
class Solution {
    fun minSubArrayLen(target: Int, nums: IntArray): Int {
        var left = 0
        var sum = 0
        var result = Int.MAX_VALUE

        for (right in nums.indices) {
            sum += nums[right]
            while (sum >= target) {
                result = minOf(result, right - left + 1)
                sum -= nums[left]
                left++
            }
        }
        return if (result == Int.MAX_VALUE) 0 else result
    }
}

WARNING

此題元素全為正數才能用滑動視窗。若有負數,需要用 Prefix Sum + TreeMap 等方法。

🔑 Takeaways