?算法OJ?滑動窗口最大值【雙端隊列(deque)】Sliding Window Maximum

文章目錄

  • 雙端隊列(deque)詳解
    • 基本特性
    • 常用操作
      • 1. 構造和初始化
      • 2. 元素訪問
      • 3. 修改操作
      • 4. 容量操作
    • 性能特點
      • 時間復雜度:
      • 空間復雜度:
  • 滑動窗口最大值
    • 題目描述
    • 方法思路
    • 解決代碼

雙端隊列(deque)詳解

雙端隊列(deque,全稱double-ended queue)是C++標準模板庫(STL)中的一個容器適配器,它允許在隊列的兩端高效地進行插入和刪除操作。

基本特性

  • 雙向操作:可以在隊列的前端和后端進行插入(push)和刪除(pop)操作
  • 隨機訪問:支持通過索引直接訪問元素(類似vector)
  • 動態大小:可以根據需要自動調整大小
  • 不連續存儲:與vector不同,deque的元素不一定是連續存儲的

常用操作

1. 構造和初始化

#include <deque>// 空deque
deque<int> dq1;// 包含n個元素的deque,初始值為0
deque<int> dq2(5); // {0, 0, 0, 0, 0}// 包含n個元素的deque,初始值為value
deque<int> dq3(5, 10); // {10, 10, 10, 10, 10}// 通過初始化列表構造
deque<int> dq4 = {1, 2, 3, 4, 5};// 通過迭代器范圍構造
deque<int> dq5(dq4.begin(), dq4.begin()+3); // {1, 2, 3}

2. 元素訪問

deque<int> dq = {1, 2, 3, 4, 5};// 使用下標運算符訪問
int a = dq[2]; // 3// 使用at()方法訪問(會檢查邊界)
int b = dq.at(3); // 4// 訪問第一個和最后一個元素
int front = dq.front(); // 1
int back = dq.back();   // 5

3. 修改操作

deque<int> dq = {1, 2, 3};// 在末尾添加元素
dq.push_back(4); // {1, 2, 3, 4}// 在開頭添加元素
dq.push_front(0); // {0, 1, 2, 3, 4}// 刪除末尾元素
dq.pop_back(); // {0, 1, 2, 3}// 刪除開頭元素
dq.pop_front(); // {1, 2, 3}// 在指定位置插入元素
auto it = dq.begin() + 1;
dq.insert(it, 5); // {1, 5, 2, 3}// 刪除指定位置元素
it = dq.begin() + 2;
dq.erase(it); // {1, 5, 3}// 清空deque
dq.clear(); // {}

4. 容量操作

deque<int> dq = {1, 2, 3};// 檢查是否為空
bool isEmpty = dq.empty(); // false// 獲取元素數量
size_t size = dq.size(); // 3// 調整大小
dq.resize(5); // {1, 2, 3, 0, 0}
dq.resize(2); // {1, 2}

性能特點

時間復雜度:

  • 隨機訪問:O(1)
  • 在開頭或結尾插入/刪除:O(1)
  • 在中間插入/刪除:O(n)

空間復雜度:

  • 比vector占用更多內存,因為需要維護多個內存塊
  • 但不需要像vector那樣在擴容時復制所有元素

滑動窗口最大值

在這里插入圖片描述

題目描述

You are given an array of integers nums, there is a sliding window of size k which is moving from the very left of the array to the very right. You can only see the k numbers in the window. Each time the sliding window moves right by one position.

Return the max sliding window.

Example 1:

Input: nums = [1,3,-1,-3,5,3,6,7], k = 3
Output: [3,3,5,5,6,7]
Explanation: 
Window position                Max
---------------               -----
[1  3  -1] -3  5  3  6  7       31 [3  -1  -3] 5  3  6  7       31  3 [-1  -3  5] 3  6  7       51  3  -1 [-3  5  3] 6  7       51  3  -1  -3 [5  3  6] 7       61  3  -1  -3  5 [3  6  7]      7

Example 2:

Input: nums = [1], k = 1
Output: [1]

這是一個經典的滑動窗口問題,我們需要找到數組中每個大小為k的滑動窗口中的最大值。

方法思路

我們可以使用雙端隊列(deque)來高效解決這個問題。主要思路是維護一個雙端隊列,隊列中存儲的是數組元素的索引,且隊列中的元素按照從大到小的順序排列。這樣可以保證隊列前端始終是當前窗口的最大值。

具體步驟如下:

  • 遍歷數組中的每個元素
  • 移除隊列中不在當前窗口范圍內的元素索引
  • 移除隊列中所有小于當前元素的索引,因為它們不可能是當前或未來窗口的最大值
  • 將當前元素索引加入隊列
  • 當窗口形成后(即i >= k-1),將隊列前端元素對應的值加入結果

解決代碼

#include <vector>
#include <deque>using namespace std;vector<int> maxSlidingWindow(vector<int>& nums, int k) {vector<int> result;deque<int> dq; // 存儲的是索引for (int i = 0; i < nums.size(); ++i) {// 移除不在窗口范圍內的元素索引while (!dq.empty() && dq.front() <= i - k) {dq.pop_front();}// 移除所有小于當前元素的索引while (!dq.empty() && nums[dq.back()] < nums[i]) {dq.pop_back();}// 添加當前元素索引dq.push_back(i);// 當窗口形成后,添加結果if (i >= k - 1) {result.push_back(nums[dq.front()]);}}return result;
}

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

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

相關文章

電機的了解到調試全方面講解

一、什么是電機 電機是一種將電能轉換為機械能的裝置,通常由定子、轉子和電磁場組成。 當電流通過電機的繞組時,產生的磁場會與電機中的磁場相互作用,從而使電機產生旋轉運動。電機廣泛應用于各種機械設備和工業生產中,是現代社會不可或缺的重要設備之一。 常見的電機種…

分布式微服務系統架構第97集:JVM底層原理

加群聯系作者vx&#xff1a;xiaoda0423 倉庫地址&#xff1a;https://webvueblog.github.io/JavaPlusDoc/ https://1024bat.cn/ JVM 內存結構 Java 虛擬機的內存空間分為 5 個部分&#xff1a; 程序計數器 Java 虛擬機棧 本地方法棧 堆 方法區 JDK 1.8 同 JDK 1.7 比&…

制定大運維管理體系的標準、流程、機制、規范

規劃并制定大運維管理體系的標準、流程、機制、規范&#xff0c;對于確保平臺的可用性和穩定性至關重要。這一過程涉及從頂層設計到具體執行的全面考量&#xff0c;需要綜合考慮業務需求、技術架構、團隊能力等多方面因素。以下是一個基本框架&#xff0c;用于指導如何構建有效…

TruPlasma RF 3006 軟件TRUMPF HUETTINGER TRUPLASMA RF 3006 調試監控軟件

TruPlasma RF 3006 軟件TRUMPF HUETTINGER TRUPLASMA RF 3006 調試監控軟件

第16屆藍橋杯單片機模擬試題Ⅱ

試題 代碼 sys.h #ifndef __SYS_H__ #define __SYS_H__#include <STC15F2K60S2.H> //ds1302.c extern unsigned char time[3]; void w_ds1302(); void r_ds1302(); //iic.c float v_adc(unsigned char addr); //sys.c extern float light_v; extern float rb2_v; exte…

清華《數據挖掘算法與應用》FP-Growth算法

【例 8.7】實現FP 樹算法,并對模擬數據集 simpDat挖掘頻繁項集,最小支持度為2,繪制 FP樹并輸出頻繁項集。 運行結果&#xff1a; 聲明&#xff1a;著作權歸作者所有。商業轉載請聯系作者獲得授權&#xff0c;非商業轉載請注明出處。 # -*- coding: utf-8 -*- ""&q…

npm 項目命名規則

以下是 npm 項目命名規則的詳細說明&#xff1a; 一、核心命名規則 必須使用小寫字母 名稱中不能包含大寫字母。原因&#xff1a; 跨平臺兼容性&#xff08;如 Linux 區分大小寫&#xff0c;而 Windows 不區分&#xff09;。避免命令行和 URL 中的大小寫沖突&#xff08;例如包…

Ubertool 的詳細介紹、安裝指南及使用說明

Ubertool&#xff1a;多協議網絡分析與調試平臺 一、Ubertool 簡介 Ubertool 是一款開源的 多協議網絡分析工具&#xff0c;專為物聯網&#xff08;IoT&#xff09;、嵌入式系統和工業自動化領域設計。它支持藍牙、Wi-Fi、LoRa、CAN總線等多種通信協議的實時監控、數據包捕獲…

AI重構農業:從“面朝黃土“到“數字原野“的產業躍遷—讀中共中央 國務院印發《加快建設農業強國規劃(2024-2035年)》

在東北黑土地的萬畝良田上&#xff0c;無人機編隊正在執行精準施肥作業&#xff1b;在山東壽光的智慧大棚里&#xff0c;傳感器網絡實時調控著番茄生長的微環境&#xff1b;在云南的咖啡種植園中&#xff0c;區塊鏈溯源系統記錄著每粒咖啡豆的旅程。這場靜默的農業革命&#xf…

FogFL: Fog-Assisted Federated Learning for Resource-Constrained IoT Devices

摘要 提示&#xff1a;這里可以添加系列文章的所有文章的目錄&#xff0c;目錄需要自己手動添加 -在本文中&#xff0c;我們提出了一個支持霧的聯邦學習框架–FogFL–來促進資源受限的物聯網環境中延遲敏感應用的分布式學習。聯邦學習&#xff08;FL&#xff09;是一種流行的分…

linux下編譯Websocketpp,適用x86和armv8

編譯boost庫 下載源文件&#xff1a;Version 1.79.0 編譯&#xff1a; sudo ./bootstrap.sh sudo ./b2 install 安裝websocketpp git clone https://github.com/zaphoyd/websocketpp.git cd websocketpp #進入目錄 mkdir build cd build cmake .. make sudo make ins…

Linux學習筆記——零基礎詳解:什么是Bootloader?U-Boot啟動流程全解析!

零基礎詳解&#xff1a;什么是Bootloader&#xff1f;U-Boot啟動流程全解析&#xff01; 一、什么是Bootloader&#xff1f;&#x1f4cc; 舉個例子&#xff1a; 二、U-Boot 是什么&#xff1f;三、U-Boot啟動過程&#xff1a;分為兩個階段&#x1f539; 第一階段&#xff08;匯…

Word 頁眉設置(不同章節不同頁眉)

需求分析 要給文檔設置頁眉&#xff0c;但是要不同的頁眉不同的頁眉 問題點&#xff1a;一旦設置頁眉 每個頁眉都是一樣的 現在要設置不一樣的 設置了頁眉但是整個文章的頁眉都一樣 問題解決 取消鏈接 前一節&#xff08;不和前面的頁眉同步更新&#xff09; 小結 不同的…

Debezium日常分享系列之:Debezium3.1版本之增量快照

Debezium日常分享系列之&#xff1a;Debezium3.1版本之增量快照 按需快照觸發一次臨時增量快照觸發臨時阻塞快照增量快照增量快照過程如何 Debezium 解決具有相同主鍵的記錄之間的沖突快照窗口觸發增量快照使用附加條件運行臨時增量快照使用 Kafka 信號通道觸發增量快照臨時增量…

音視頻開發從入門到精通:編解碼、流媒體協議與FFmpeg實戰指南

音視頻開發從入門到精通&#xff1a;編解碼、流媒體協議與FFmpeg實戰指南 音視頻技術作為數字媒體領域的核心&#xff0c;正在成為互聯網和移動應用的重要組成部分。本文將全面介紹音視頻開發的學習路徑&#xff0c;從基礎概念到高級應用&#xff0c;從編解碼原理到實戰案例&a…

bookkeeper基本概念

Apache BookKeeper 架構與基本概念 Apache BookKeeper 的架構 Apache BookKeeper 是一個高性能的分布式日志存儲系統&#xff0c;主要用于存儲和管理順序寫入的數據。它被設計用來提供低延遲、高吞吐量和強一致性的服務&#xff0c;常用于分布式系統中的日志存儲需求&#xf…

Scala相關知識學習總結3

包 - 包聲明&#xff1a;和Java類似&#xff0c;作用是區分同名類、管理類命名空間。Scala包名只能含數字、字母等&#xff0c;不能數字開頭、不能用關鍵字。 - 包說明&#xff1a;有類似Java的包管理風格&#xff0c;也有獨特嵌套風格。嵌套風格有兩個特點&#xff0c;一是&…

在Spring Boot中實現圖片上傳和修改

1. 圖片上傳實現步驟 1.1 添加依賴 確保 spring-boot-starter-web 和 spring-boot-starter-validation 已存在&#xff1a; <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId> <…

網絡原理 - HTTP/HTTPS

1. HTTP 1.1 HTTP是什么&#xff1f; HTTP (全稱為 “超文本傳輸協議”) 是?種應用非常廣泛的應用層協議. HTTP發展史&#xff1a; HTTP 誕生于1991年. 目前已經發展為最主流使用的?種應用層協議 最新的 HTTP 3 版本也正在完善中, 目前 Google / Facebook 等公司的產品已經…

第十屆MathorCup高校數學建模挑戰賽-A題:無車承運人平臺線路定價問題

目錄 摘 要 一、問題提出 1.1 背景 1.2 問題重述 二、基本假設 三、符號說明 四、問題分析 4.1 問題一的分析 4.2 問題二的分析 4.3 問題三的分析 4.4 問題四的分析 五、模型的建立與求解 5.1 問題一模型的建立與求解 5.1.1 數據預處理 5.1.2 問題一結果檢驗:因子分析模型 5.2…