← 回首頁

滑動視窗(Sliding Window)

想像你在一長排數字上蓋一個取景框,只看框裡那幾格。要算「連續一段的總和/最大值」時,笨辦法是每換一個起點就把框裡全部重加一次,重覆到手軟。滑動視窗的巧思是:框往右滑一格,就只做「新進來一個、走掉一個」的加減,不必整框重算——像看電影跑馬燈,畫面往前推一格,你只需注意新冒出的字和消失的字。這樣一趟掃完就有答案,省下大量重工。下面你會看到兩種框:一種寬度固定、一種會依條件自己伸縮

滑動視窗是雙指標技巧的一種特化:用兩個指標維護一段連續子陣列,避免對每個起點都重新掃描一次區間,把 O(n²) 降到 O(n)。依視窗大小是否固定,分成兩種典型用法:

1. 固定視窗(Fixed Size)— 長度 k 的最大子陣列和

先加總前 k 個元素作為首個視窗和,之後視窗每右移一格,新進 nums[i]、移出 nums[i-k], 用 windowSum += nums[i] - nums[i-k] 做增量更新,避免重新加總整個視窗。

陣列(逗號分隔,2–12 個整數,每個 0–99): 視窗大小 k(1–n):
滑動次數:0
淡出(半透明)的長條為視窗外元素;藍色外框為本步驟剛新進/移出的位置。

2. 可變視窗(Variable Size)— 和 ≥ target 的最短子陣列

right 指標逐步右移擴張視窗並累加 sum;一旦 sum ≥ target,就在條件仍成立時持續收縮 left(同時更新最短長度), 直到 sum 再次小於 target 為止,藉此在一次掃描內找出最短滿足條件的子陣列。

陣列(逗號分隔,2–12 個整數,每個 1–99,需全正): target(1–999):
擴張次數:0 收縮次數:0
淡出(半透明)的長條為視窗外元素;藍色外框為當前 right/left 指標所在位置。