C/C++滑動窗口算法深度解析與實戰指南

C/C++滑動窗口算法深度解析與實戰指南

引言

滑動窗口算法是解決數組/字符串連續子序列問題的利器,通過動態調整窗口邊界,將暴力解法的O(n2)時間復雜度優化至O(n)。本文將系統講解滑動窗口的核心原理、C/C++實現技巧及經典應用場景,助您掌握這一高效算法。

一、算法核心原理

1.1 窗口雙指針模型

  • 左右指針:使用leftright指針界定窗口邊界
  • 動態調整
    • 擴展窗口:右指針右移擴大窗口范圍
    • 收縮窗口:當條件不滿足時左指針右移縮小窗口
  • 狀態維護:通過哈希表/數組記錄窗口內元素狀態

1.2 兩種窗口類型

窗口類型特點典型場景
固定窗口窗口大小恒定滑動平均值、固定長度子數組
可變窗口窗口大小動態調整最長無重復子串、最小覆蓋子串

二、C/C++實現詳解

2.1 固定窗口實現模板

int fixedWindow(vector<int>& nums, int k) {int sum = 0, max_sum = 0;// 初始化窗口for (int i = 0; i < k; ++i) sum += nums[i];max_sum = sum;// 滑動窗口for (int right = k; right < nums.size(); ++right) {sum += nums[right] - nums[right - k];  // 滾動更新max_sum = max(max_sum, sum);}return max_sum;
}

2.2 可變窗口實現模板

int variableWindow(string s) {unordered_map<char, int> window;int left = 0, max_len = 0;for (int right = 0; right < s.size(); ++right) {char c = s[right];window[c]++;  // 擴展窗口// 收縮條件:出現重復字符while (window[c] > 1) {char d = s[left];window[d]--;  // 移出左邊界left++;}max_len = max(max_len, right - left + 1);  // 更新結果}return max_len;
}

三、經典問題解析

3.1 無重復字符的最長子串(LeetCode 3)

int lengthOfLongestSubstring(string s) {vector<int> char_map(128, -1);  // ASCII映射表int max_len = 0, left = 0;for (int right = 0; right < s.size(); ++right) {if (char_map[s[right]] >= left) {left = char_map[s[right]] + 1;  // 跳躍收縮}char_map[s[right]] = right;  // 更新最新位置max_len = max(max_len, right - left + 1);}return max_len;
}

3.2 最小覆蓋子串(LeetCode 76)

string minWindow(string s, string t) {unordered_map<char, int> need, window;for (char c : t) need[c]++;int left = 0, valid = 0, start = 0, min_len = INT_MAX;for (int right = 0; right < s.size(); ++right) {char c = s[right];if (need.count(c)) {window[c]++;if (window[c] == need[c]) valid++;}// 收縮窗口while (valid == need.size()) {if (right - left + 1 < min_len) {min_len = right - left + 1;start = left;}char d = s[left++];if (need.count(d)) {if (window[d] == need[d]) valid--;window[d]--;}}}return min_len == INT_MAX ? "" : s.substr(start, min_len);
}

四、性能優化技巧

4.1 空間優化

  • 數組替代哈希表:當字符集確定時(如ASCII),使用數組存儲頻次
    int char_count[128] = {0};  // 替代unordered_map
    

4.2 時間優化

  • 跳躍收縮:發現重復元素時直接跳轉到重復位置+1
  • 提前終止:當窗口長度已達理論最大值時break

五、復雜度分析

場景時間復雜度空間復雜度
固定窗口O(n)O(1)
可變窗口(哈希表)O(n)O(Σ)
可變窗口(數組)O(n)O(1)

六、應用場景拓展

  1. 字符串處理

    • 字母異位詞檢測
    • DNA序列分析
    • 回文子串查找
  2. 數組問題

    • 最大連續1的個數
    • 乘積小于K的子數組
    • 股票買賣時機分析
  3. 數據流處理

    • 實時移動平均值計算
    • 異常值檢測

七、常見錯誤避坑指南

  1. 指針越界:確保left <= rightright < n
  2. 狀態殘留:窗口收縮后需及時更新狀態變量
  3. 循環條件:可變窗口必須使用while收縮而非if
  4. 初始值設置:max_len應初始化為0而非INT_MIN

結語

滑動窗口算法通過精妙的指針操作,將復雜度從平方級別降至線性,是解決連續子序列問題的首選方案。掌握其核心思想與實現技巧,您將能高效解決LeetCode 3、76、209等經典題目。建議通過大量練習加深理解,特別是對窗口收縮條件的判斷和狀態維護的細節處理。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/81841.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/81841.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/81841.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Vuex使用指南:狀態管理

一、什么是狀態管理&#xff1f;為什么需要 Vuex&#xff1f; 1. 狀態管理的基本概念 在 Vue 應用中&#xff0c;狀態指的是應用中的數據。例如&#xff1a; 用戶登錄狀態購物車中的商品文章列表的分頁信息 狀態管理就是對這些數據的創建、讀取、更新和刪除進行有效管理。 …

【信息系統項目管理師-論文真題】2007下半年論文詳解(包括解題思路和寫作要點)

更多內容請見: 備考信息系統項目管理師-專欄介紹和目錄 文章目錄 試題1:大型項目的計劃與監控1、寫作要點2、解題思路大型信息系統項目的組織制訂大型信息系統項目進度計劃的方法試題2:組織級項目管理的績效考核1、寫作要點2、解題思路在項目考核過程中會遇到哪些問題項目的…

項目管理學習-CSPM(1)

01引言 最近在學習CSPM的課程&#xff0c;有部分的內容自己還是受益匪淺的&#xff0c;建議有需要提升項目管理能力的同學可以以考促學的方式進行學習&#xff0c;下面整理了一部分內容和大家分享和學習。CSPM全稱 China Standards Project Management&#xff0c;中文名項目管…

介紹分治、動態規劃、回溯分別是什么?有什么聯系和區別?給出對象的場景和java代碼?

一、分治算法&#xff08;Divide and Conquer&#xff09; 概念&#xff1a; 分治算法是將一個復雜問題分成若干個子問題&#xff0c;每個子問題結構與原問題類似&#xff0c;然后遞歸地解決這些子問題&#xff0c;最后將子問題的結果合并得到原問題的解。 特點&#xff1a;…

解鎖DeepSeek模型微調:從小白到高手的進階之路

目錄 一、DeepSeek 模型初相識二、探秘微調原理2.1 遷移學習基礎2.2 微調的參數更新機制 三、數據準備3.1 數據收集3.2 數據標注3.3 數據預處理 四、模型選擇與加載4.1 選擇合適的預訓練模型4.2 加載模型 五、微調訓練實戰5.1 確定微調策略5.2 設置訓練參數5.3 訓練過程 六、模…

端到端觀測分析:從前端負載均衡到后端服務

前言 我們在做系統運維保障的時候&#xff0c;關注從前端負載均衡到后端服務的流量情況是很有必要的&#xff0c;可以了解每個后端服務實例接收的流量大小&#xff0c;這有助于確定資源分配是否合理&#xff0c;能夠幫助找出后端服務中的性能瓶頸。同時&#xff0c;當系統出現…

Ubuntu下OCC7.9+Qt5 快速搭建3D可視化框架

Ubuntu下OCC7.9+Qt5搭建簡易的項目框架 近兩年國產CAD替代如日中天,而幾何內核作為CAD軟件的核心組件之一,當前有且僅有唯一開源的幾何內核庫即OCCT;這里為各位自立于投入CAD開發或正在學習OCC庫的小伙伴們奉獻上一個快速搭建QT+OCC的項目框架; 本文介紹了Qt5+Occ 顯示幾何…

C++類與對象—下:夯實面向對象編程的階梯

9. 賦值運算符重載 9.1 運算符重載 在 C 里&#xff0c;運算符重載能夠讓自定義類型的對象像內置類型那樣使用運算符&#xff0c;這極大地提升了代碼的可讀性與可維護性。運算符重載本質上是一種特殊的函數&#xff0c;其函數名是 operator 加上要重載的運算符。 下面是運算…

【深度學習-Day 6】掌握 NumPy:ndarray 創建、索引、運算與性能優化指南

Langchain系列文章目錄 01-玩轉LangChain&#xff1a;從模型調用到Prompt模板與輸出解析的完整指南 02-玩轉 LangChain Memory 模塊&#xff1a;四種記憶類型詳解及應用場景全覆蓋 03-全面掌握 LangChain&#xff1a;從核心鏈條構建到動態任務分配的實戰指南 04-玩轉 LangChai…

工程師 - 汽車分類

歐洲和中國按字母對汽車分類&#xff1a; **軸距**&#xff1a;簡單來說&#xff0c;就是前輪中心點到后輪中心點之間的距離&#xff0c;也就是前輪軸和后輪軸之間的長度。根據軸距的大小&#xff0c;國際上通常把轎車分為以下幾類&#xff08;德國大眾汽車習慣用A\B\C\D分類&a…

[低代碼 + AI] 明道云與 Dify 的三種融合實踐方式詳解

隨著低代碼平臺和大語言模型工具的不斷發展,將企業數據與智能交互能力融合,成為提高辦公效率與自動化水平的關鍵一步。明道云作為一款成熟的低代碼平臺,Dify 則是一個支持自定義工作流的開源 LLM 應用框架。兩者結合,可以實現靈活、高效的智能化業務處理。 本文將詳解明道…

鼠標懸浮特效:常見6種背景類懸浮特效

鼠標懸浮特效&#xff1a;常見6種背景類懸浮特效 前言背景閃現效果預覽代碼展示 元素陰影效果預覽代碼展示 元素懸浮陰影效果預覽代碼展示 元素上浮陰影效果預覽代碼展示 元素邊框陰影效果預覽代碼展示 元素卷角效果預覽代碼展示 結語 前言 在之前的文章中&#xff0c;我們介紹…

[人機交互]理解與概念化交互

零.本章重點&#xff08;理解和分析用戶問題&#xff09; – 解釋“問題空間”的概念和含義 – 解釋如何概念化交互 – 描述什么是概念模型 – 討論將界面隱喻作為概念模型的利弊 – 討論界面具體化和抽象化各自的優缺點 – 概述概念設計和實際設計的關系 一.理解問題空間 簡單…

9.城市基礎設施更新工程

9.1 道路改造施工 9.1.1 道路改造施工內容 瀝青、水泥混凝土、砌塊路面、人行步道、綠化照明、附屬設施、交通標志、瀝青路面材料的再生利用 9.1.2 道路改造施工技術 1.瀝青路面病害及微表處理 1.病害處理 裂縫處理 10mm以內專業灌縫材料或熱瀝青灌縫、潮濕時乳化瀝青灌封…

Milvus(11):動態字段、可歸零和默認值

1 動態字段 Collections 的 Schema 中定義的所有字段都必須包含在要插入的實體中。如果希望某些字段是可選的&#xff0c;可以考慮啟用動態字段。 1.1 概述 在 Milvus 中&#xff0c;可以通過設置 Collections 中每個字段的名稱和數據類型來創建 Collections Schema。向 Schem…

LeetCode41?缺失的第一個正數

關聯LeetCode題號41 本題特點 數組&#xff0c;哈希表 本題思路 找缺失的最小正數&#xff0c;看舉例說明缺失的正數&#xff0c;一種情況是連續的最小的正數&#xff0c;一種是缺失連續但不是最小的正數驗證數組內數組是否連續&#xff0c;可以通過 nums[i]1 是否存nums組…

補題( Convolution, 二維卷積求輸出矩陣元素和最大值)

來源&#xff1a;https://codeforces.com/gym/105231/problem/H 題目描述&#xff1a; 一、題目分析 本題涉及深度學習中的二維卷積操作。給定一個nm的二維輸入矩陣I和一個kl的核矩陣K &#xff0c;通過特定公式計算得到(n - k 1)(m - l 1)的輸出矩陣O &#xff0c;要求在…

【Java ee初階】多線程(7)

一、線程池 線程池的一些參數&#xff1a; corePoolSize&#xff1a;核心線程數量 maximumPoolSize:核心線程數量臨時線程數量 上述是“java 的線程池策略”&#xff08;其他語言&#xff0c;其他庫的線程池可能不同&#xff09; keepAliveTime :臨時線程的存活時間.臨時線程…

Linux 常用指令詳解

Linux 操作系統中有大量強大的命令行工具&#xff0c;下面我將分類介紹一些最常用的指令及其用法。 ## 文件與目錄操作 ### 1. ls - 列出目錄內容 ls [選項] [目錄名] 常用選項&#xff1a; - -l&#xff1a;長格式顯示&#xff08;詳細信息&#xff09; - -a&#xff1a;顯…

uv安裝及使用

windows安裝參考&#xff1a; 什么是python uv&#xff0c;如何在windows上安裝uv&#xff0c;基礎的用法有哪些&#xff1f;_windows安裝uv-CSDN博客 https://zhuanlan.zhihu.com/p/6776864377 使用方式 方式1&#xff1a; 創建uv虛擬環境->激活環境->安裝依賴&…