基本資料#
難易度:中等 第一次嘗試:2025-08-09
- 總花費時間:00:00.00
解題思路#
這題屬於滑動視窗。用右指針累加視窗總和,當總和大於等於 target
時,開始從左邊縮小視窗,試著在仍符合條件的前提下把長度壓到最短。
解法#
- 維護區間
[left, right]
與window_sum
。 - 每次右移
right
就把nums[right]
加進window_sum
。 - 只要
window_sum ≥ target
,就更新答案,並持續右移left
同時扣除nums[left]
,以取得更短的合法視窗。
from typing import List
class Solution:
def minSubArrayLen(self, target: int, nums: List[int]) -> int:
left = 0
window_sum = 0
min_length = float("inf")
for right, value in enumerate(nums):
window_sum += value
while window_sum >= target:
min_length = min(min_length, right - left + 1)
window_sum -= nums[left]
left += 1
return 0 if min_length == float("inf") else min_length
複雜度#
- 時間:O(n)
- 空間:O(1)
收穫#
- 所有數字為正時,滑動視窗才能單調縮小並保證不會漏解。
- 不變量:一旦
window_sum ≥ target
,就嘗試移動left
以縮短視窗。 - 另一種作法是前綴和 + 二分搜尋,時間 O(n log n),但本題滑動視窗已是最佳。