leetcode239 滑動窗口最大值deque方式

這段文字描述的是使用單調隊列(Monotonic Queue) 解決滑動窗口最大值問題的優化算法。我來簡單解釋一下:

核心思路

  1. 問題分析:在滑動窗口中,若存在兩個下標 i < jnums[i] ≤ nums[j],則 nums[i] 永遠不可能成為后續窗口的最大值(因為 j 會比 i 更晚離開窗口)。因此,可以提前淘汰 nums[i]

  2. 數據結構選擇:使用雙端隊列(Deque)維護一個單調遞減的下標序列,確保隊列中元素對應的值從隊首到隊尾嚴格遞減。

  3. 維護單調隊列

    • 插入新元素:將新元素與隊尾比較,若新元素更大,則不斷彈出隊尾,直到滿足單調性。
    • 淘汰舊元素:檢查隊首元素是否已超出窗口范圍,若超出則彈出隊首。

算法步驟

  1. 初始化隊列:遍歷前 k 個元素,維護單調隊列。
  2. 處理每個窗口
    • 淘汰舊元素:若隊首下標超出窗口左邊界,彈出隊首。
    • 插入新元素:將當前元素下標加入隊尾,彈出所有不大于當前值的隊尾元素。
    • 記錄最大值:隊首元素對應的值即為當前窗口的最大值。
  3. 滑動窗口:重復步驟2,直到處理完所有窗口。

示例代碼(C++)

#include <iostream>
#include <vector>
#include <deque>
using namespace std;vector<int> maxSlidingWindow(vector<int>& nums, int k) {int n = nums.size();vector<int> result;if (n == 0 || k == 0) return result;deque<int> q; // 存儲下標,對應的值單調遞減// 初始化第一個窗口(前k個元素)for (int i = 0; i < k; ++i) {// 彈出所有比當前元素小的隊尾下標(維護單調遞減)while (!q.empty() && nums[i] >= nums[q.back()]) {q.pop_back();}q.push_back(i);}result.push_back(nums[q.front()]); // 第一個窗口的最大值// 滑動窗口處理后續元素for (int i = k; i < n; ++i) {// 淘汰已離開窗口的隊首下標(左邊界為i-k+1,下標<=i-k時淘汰)while (!q.empty() && q.front() <= i - k) {q.pop_front();}// 維護單調遞減:彈出所有比當前元素小的隊尾下標while (!q.empty() && nums[i] >= nums[q.back()]) {q.pop_back();}q.push_back(i);result.push_back(nums[q.front()]); // 當前窗口最大值}return result;
}// 測試示例
int main() {vector<int> nums = {1, 3, -1, -3, 5, 3, 6, 7};int k = 3;vector<int> res = maxSlidingWindow(nums, k);cout << "滑動窗口最大值:";for (int num : res) {cout << num << " ";}// 輸出:3 3 5 5 6 7return 0;
}

可將步驟整合在一個循環里:

class Solution {
public:vector<int> maxSlidingWindow(vector<int>& nums, int k) {int n = nums.size();if (n == 0 || k == 0) {return {};}deque<int> q; // 雙端隊列,存儲窗口內元素的索引vector<int> res;for (int i = 0; i < n; ++i) {// 移除隊列中不在當前窗口內的元素while (!q.empty() && q.front() <= i - k) {q.pop_front();}// 移除隊列中所有小于等于當前元素的索引while (!q.empty() && nums[i] >= nums[q.back()]) {q.pop_back();}// 將當前元素的索引加入隊列q.push_back(i);// 當窗口形成后,記錄當前窗口的最大值if (i >= k - 1) {res.push_back(nums[q.front()]);}}return res;}
};

復雜度分析

  • 時間復雜度:O(n),每個元素最多入隊和出隊一次。
  • 空間復雜度:O(k),隊列中最多存儲 k 個元素。

關鍵點

  • 單調隊列:通過維護單調性,避免重復比較,將暴力算法的 O(nk) 優化到 O(n)。
  • 雙端隊列:支持 O(1) 時間復雜度的隊首和隊尾操作。
  • 應用場景:適用于求解滑動窗口最大值/最小值、子數組最大和等問題。

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

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

相關文章

小白的進階之路系列之三----人工智能從初步到精通pytorch計算機視覺詳解下

我們將繼續計算機視覺內容的講解。 我們已經知道了計算機視覺,用在什么地方,如何用Pytorch來處理數據,設定一些基礎的設置以及模型。下面,我們將要解釋剩下的部分,包括以下內容: 主題內容Model 1 :加入非線性實驗是機器學習的很大一部分,讓我們嘗試通過添加非線性層來…

elementUI 單選框存在多個互斥的選項中選擇的場景

使用 el-radio-group 來使用單選框組&#xff0c;代碼如下&#xff1a; <el-radio-group input"valueChangeHandler" v-model"featureForm.type"><el-radio name"feature" label"feature">業務對象</el-radio><…

Qt項目開發中所遇

講述下面代碼所表示的含義&#xff1a; QWidget widget_19 new QWidget(); QVBoxLayout *touchAreaLayout new QVBoxLayout(widget_19);QWidget *buttonArea new QWidget(widget_19); 1、新建一個名為widget_19的QWidget&#xff0c;將給其應用垂直管路布局。 2、新建一個…

相機標定與圖像處理涉及的核心坐標系

坐標系相互關系 #mermaid-svg-QxaMjIcgWVap0awV {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-QxaMjIcgWVap0awV .error-icon{fill:#552222;}#mermaid-svg-QxaMjIcgWVap0awV .error-text{fill:#552222;stroke:#552…

CICD編譯時遇到npm error code EINTEGRITY的問題

場景 CICD編譯時拋出npm error code EINTEGRITY的錯誤 npm error code EINTEGRITY npm error sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA integrity checksum failed when using sha512: wanted sha512-PlhdFcillOINfeV…

使用Spring Boot與Spring Security構建安全的RESTful API

使用Spring Boot與Spring Security構建安全的RESTful API 引言 在現代Web應用開發中&#xff0c;安全性是一個不可忽視的重要方面。Spring Boot和Spring Security為開發者提供了一套強大的工具&#xff0c;用于構建安全的RESTful API。本文將詳細介紹如何結合Spring Boot和Sp…

機器人拖動示教控制

機器人拖動示教控制 機器人拖動視角控制與軌跡記錄 1. 知識目標 體驗ES機器人拖動視角操作體驗ES機器人拖動軌跡記錄 2. 技能目標 掌握ES機器人拖動視角操作掌握ES機器人拖動軌跡記錄 3. ES機器人拖動視角操作 3.1 操作步驟 點擊“拖動視角”按鈕長按“啟用”鍵約3秒進入…

RuoYi-Vue3-FastAPI框架的功能實現(上)

RuoYi-Vue3-FastAPI框架的功能實現&#xff08;上&#xff09; 感謝大佬給出關于python后端的若依框架&#xff0c;希望這個簡單文檔能幫助到大家。 安裝與運行&#xff1a; 下載地址&#xff1a;Vue2版本&#xff1a; Gitte倉庫地址&#xff1a;RuoYi-Vue-FastAPI: 基于Vu…

Paimon和Hive相集成

Paimon版本1.17 Hive版本3.1.3 1、Paimon集成Hive 將paimon-hive-connector.jar復制到auxlib中&#xff0c;下載鏈接Index of /groups/snapshots/org/apache/https://repository.apache.org/snapshots/org/apache/paimon/ 通過flink進入查看paimon /opt/softwares/flink-1…

【Leetcode 每日一題】3362. 零數組變換 III

問題背景 給你一個長度為 n n n 的整數數組 n u m s nums nums 和一個二維數組 q u e r i e s queries queries&#xff0c;其中 q u e r i e s [ i ] [ l i , r i ] queries[i] [l_i, r_i] queries[i][li?,ri?]。 每一個 q u e r i e s [ i ] queries[i] queries[i]…

計算機視覺與深度學習 | 用于圖像分割的自監督學習(Self-Supervised Learning)方法綜述

圖像分割 用于圖像分割的自監督學習(Self-Supervised Learning)方法綜述**1. 背景與意義****2. 方法演進****3. 圖像分割子任務與SSL策略****4. 自監督預訓練任務分類****5. 基準數據集與評估指標****6. 挑戰與未來方向****總結**用于圖像分割的自監督學習(Self-Supervised …

Jenkins集成Docker與K8S構建

Jenkins 是一個開源的持續集成和持續交付(CI/CD)工具,廣泛用于自動化軟件開發過程中的構建、測試和部署任務。它通過插件系統提供了高度的可擴展性,支持與多種開發工具和技術的集成。 Jenkins 的核心功能 Jenkins 的主要功能包括自動化構建、測試和部署。它能夠監控版本控…

使用 adb 命令截取 Android 設備的屏幕截圖

使用 adb 命令截取 Android 設備的屏幕截圖。以下是兩種常見的方法&#xff1a; 方法一&#xff1a;截屏后保存到電腦 adb shell screencap -p /sdcard/screenshot.png adb pull /sdcard/screenshot.png解釋&#xff1a; adb shell screencap -p /sdcard/screenshot.png&…

參與開發的注意事項

1.開發期間&#xff0c;不要擅自修改架構的內容 使用技術官發的項目文件夾來開發&#xff0c;而不是自己建立項目&#xff0c; 否則會導致環境不統一 架構內容&#xff1a;&#xff08;不能更改&#xff09; 1.類型定義&#xff0c;全局變量聲明 2.函數申明&#xff08;函數名稱…

linux安裝nginx和前端部署vue項目

1、打包前端項目 npm run build 執行完后會在根目錄下生成一個dist文件夾&#xff0c;這個dist文件夾就是我們后面要部署到nginx的東西。 2、將dist文件夾上傳到服務器中 自己建一個目錄&#xff0c;上傳即可&#xff08;盡量不要在root目錄下&#xff0c;可能涉及權限問題…

親測有效!OGG 創建抽取進程報錯 OGG-08241,如何解決?

前言 今天在測試 OGG 一個功能的時候&#xff0c;需要重新初始化 oggca&#xff0c;所以重裝了一下 OGG。重建完之后重新添加抽取進程報錯&#xff0c;一直無法添加成功&#xff1a; 經過一翻分析&#xff0c;找到了解決方案&#xff0c;本文記錄一下解決過程。 問題描述 OG…

Docker構建 Dify 應用定時任務助手

概述 Dify 定時任務管理工具是一個基于 GitHub Actions 的自動化解決方案&#xff0c;用于實現 Dify Workflow 的定時執行和狀態監控。無需再為缺乏定時任務支持而感到困擾&#xff0c;本工具可以幫助設置自動執行任務并獲取實時通知&#xff0c;優化你的工作效率。 注意&…

ubuntu24.04+RTX5090D 顯卡驅動安裝

初步準備 Ubuntu默認內核太舊&#xff0c;用mainline工具安裝新版&#xff1a; sudo add-apt-repository ppa:cappelikan/ppa sudo apt update && sudo apt full-upgrade sudo apt install -y mainline mainline list # 查看可用內核列表 mainline install 6.13 # 安裝…

網絡爬蟲(Web Crawler)詳解

網絡爬蟲(Web Crawler)詳解 1. 基本概念與核心目標 定義: 網絡爬蟲是一種自動化的程序,通過HTTP協議訪問網頁,提取并存儲數據(如文本、鏈接、圖片),并根據策略遞歸訪問新鏈接。核心目標: 數據采集:抓取特定網站或全網公開數據。索引構建:為搜索引擎提供頁面內容(如…

大模型如何助力數學可視化?

大家好&#xff0c;我是 i 學習的老章 在數學學習和教學中&#xff0c;將抽象概念可視化對于理解至關重要。Manim 是一個強大的數學動畫引擎&#xff0c;由著名數學科普視頻作者 3Blue1Brown 開發并廣為人知。 老章較早之前就介紹過 manim&#xff1a;B 站上爆紅的數學視頻&a…