Sliding Window 是一個把 O(n²) 的暴力雙迴圈,壓縮成 O(n) 單次遍歷的技巧。核心概念很簡單:維護一個「視窗」,根據條件動態調整它的左右邊界,不需要每次都從頭掃。Best Time to Buy and Sell Stock 是這個模式最直觀的入門題。
題目
給一個陣列 prices,prices[i] 代表第 i 天的股票價格。你只能買賣一次,求最大獲利。
暴力解:兩層迴圈 O(n²)
最直覺的做法:枚舉所有買入和賣出的組合。
這樣做會超時(LeetCode 會 TLE)。問題在於:每次移動買入點,賣出點都要從頭掃。但我們根本不需要這樣——賣出的最佳時機,就是在「當前買入點之後的最高價」,而這可以用一次遍歷追蹤。
Sliding Window 思維
用兩個指針:min_price(目前最低買入價)和當前遍歷到的價格。
規則很簡單:
min_price(視窗左邊界往右移)解法
min 作為變數名的版本是一樣的邏輯,只是 min 是 Python 內建函式,建議改用 min_price 避免覆蓋內建名稱。Sliding Window 的通用模板
Buy and Sell Stock 是「固定視窗右端,動態更新左端」的變形。更通用的 Sliding Window 是動態調整視窗大小的版本,適用於「最長/最短子字串」類型的題目:
Longest Substring Without Repeating Characters
視窗內不能有重複字元,遇到重複就縮小左邊
Minimum Window Substring
視窗內要包含所有目標字元,滿足條件後縮小左邊找最短
Longest Repeating Character Replacement
視窗內替換次數不超過 k,超過就縮小左邊
Sliding Window 的精髓:右邊界推進「擴大」視窗,左邊界推進「縮小」視窗。整個過程,left 和 right 都只往右走,總共最多走 2n 步,所以是 O(n)。
本篇重點整理