【LeetCode 熱題 100】239. 滑動窗口最大值——(解法二)滑動窗口+單調隊列

Problem: 239. 滑動窗口最大值
題目:給你一個整數數組 nums,有一個大小為 k 的滑動窗口從數組的最左側移動到數組的最右側。你只可以看到在滑動窗口內的 k 個數字。滑動窗口每次只向右移動一位。返回滑動窗口中的最大值 。

【LeetCode 熱題 100】239. 滑動窗口最大值——(解法一)滑動窗口+暴力解

文章目錄

  • 整體思路
  • 完整代碼
  • 時空復雜度
    • 時間復雜度:O(N)
    • 空間復雜度:O(k)

整體思路

這段代碼旨在高效地解決 “滑動窗口最大值” 問題。與上一個 O(N*k) 的暴力解法不同,此版本采用了 單調隊列(Monotonic Queue) 的核心思想,這是一種專門為此類問題設計的優化數據結構,能將時間復雜度降至線性級別。

算法的核心在于維護一個單調遞減的雙端隊列 win。這個隊列有以下幾個關鍵特性:

  1. 存儲內容:隊列中存儲的不是元素值,而是元素在原數組 nums 中的 索引
  2. 單調性:隊列中的索引所對應的 nums 值是嚴格單調遞減的。即 nums[win[0]] > nums[win[1]] > nums[win[2]] ...
  3. 隊首即最大值:由于隊列的單調性,隊首元素 win.peekFirst() 始終是當前窗口內最大值的索引。

算法的執行步驟如下:

  1. 初始化

    • 創建一個結果數組 ans
    • 創建一個雙端隊列 win 作為單調隊列。
  2. 滑動窗口與單調隊列維護

    • 算法使用 right 指針從左到右遍歷 nums 數組。對于每個新元素 nums[right]
      a. 維護單調性(隊尾操作)
      • 進入一個 while 循環,從隊尾開始檢查。如果隊尾索引對應的元素 nums[win.peekLast()] 小于或等于當前要入隊的新元素 nums[right],則將隊尾元素彈出(win.pollLast())。
      • 這個過程會持續進行,直到隊尾元素大于新元素,或者隊列為空。這確保了所有比新元素小的“舊”元素都被清除,因為它們在未來的窗口中不可能成為最大值。
      • 完成清理后,將當前元素的索引 right 加入隊尾(win.offerLast(right))。
        b. 維護窗口大小(隊首操作)
      • 檢查隊首元素的索引 win.peekFirst() 是否已經滑出當前窗口的左邊界。窗口的左邊界是 right - k + 1。如果隊首索引小于這個邊界(等價于 right - win.peekFirst() + 1 > k),說明隊首元素已過期,需要從隊首彈出(win.pollFirst())。
        c. 記錄結果
      • 當窗口形成后(right >= k - 1),根據單調隊列的性質,此時的隊首元素 win.peekFirst() 就是當前窗口最大值的索引。
      • nums[win.peekFirst()] 存入結果數組 ans 的相應位置。
  3. 返回結果

    • 遍歷結束后,返回 ans 數組。

通過這種方式,每個元素最多入隊一次、出隊一次,使得在整個過程中找到所有窗口最大值的均攤時間復雜度為 O(1),從而實現了整體的線性時間復雜度。

完整代碼

class Solution {/*** 計算滑動窗口的最大值(優化版)。* @param nums 整數數組* @param k 窗口大小* @return 包含每個窗口最大值的數組*/public int[] maxSlidingWindow(int[] nums, int k) {int n = nums.length;// 計算結果數組的長度int m = n - k + 1;int[] ans = new int[m];// win: 一個雙端隊列,用作單調隊列,存儲元素的索引。// 隊列中的索引對應的 nums 值保持單調遞減。Deque<Integer> win = new ArrayDeque<>();// right 指針作為窗口的右邊界,遍歷整個數組for (int right = 0; right < n; right++) {// 步驟 1: 維護隊列的單調遞減性// 當隊列不為空,且隊尾索引對應的元素小于或等于當前元素時,// 將隊尾元素彈出。因為這個較小的元素在未來不可能成為最大值。while (!win.isEmpty() && nums[win.peekLast()] <= nums[right]) {win.pollLast();}// 將當前元素的索引加入隊尾win.offerLast(right);// 步驟 2: 維護窗口的有效范圍// 檢查隊首元素的索引是否已經滑出窗口左邊界。// 窗口的左邊界是 right - k + 1。如果隊首索引小于它,則說明已過期。// (right - win.peekFirst() + 1) 是隊首元素和當前元素構成的窗口大小。if (right - win.peekFirst() + 1 > k) {// 彈出過期的隊首元素win.pollFirst();}// 步驟 3: 記錄結果// 當窗口大小達到 k 時(即 right 遍歷到第 k-1 個元素時),開始記錄最大值if (right >= k - 1) {// 由于隊列的單調性,隊首元素始終是當前窗口內最大值的索引ans[right - k + 1] = nums[win.peekFirst()];}}return ans;}
}

時空復雜度

時間復雜度:O(N)

  1. 循環:代碼的主體是一個 for 循環,它遍歷 nums 數組一次,執行 N 次。
  2. 隊列操作
    • while 循環中的 win.pollLast()if 判斷中的 win.pollFirst() 操作看起來可能導致時間復雜度升高。
    • 然而,每個元素的索引最多只會入隊一次和出隊一次
    • offerLast 將每個索引 0N-1 各壓入一次,總共 N 次。
    • pollLastpollFirst 共同將這些索引彈出,每個索引最多被彈出一次。
    • 因此,所有隊列操作的總次數是 O(N) 級別的。將這些操作的成本均攤N 次外層循環中,每次循環的均攤時間復雜度為 O(1)

綜合分析
算法由 N 次均攤時間復雜度為 O(1) 的操作組成。因此,總的時間復雜度是 O(N)

空間復雜度:O(k)

  1. 主要存儲開銷:算法使用了一個雙端隊列 win 來存儲索引。
  2. 空間大小:隊列 win 中存儲的是當前有效窗口內的候選最大值的索引。在任何時刻,隊列的長度都不會超過窗口大小 k。例如,如果輸入數組是嚴格遞減的,如 [5, 4, 3, 2, 1]k=3,隊列會存儲 [i, i+1, i+2] 三個索引。因此,隊列的最大空間占用為 O(k)
  3. 結果數組ans 數組的空間為 O(N),但不計入額外輔助空間。

綜合分析
算法所需的額外輔助空間主要由單調隊列 win 決定,其大小與窗口大小 k 成正比。因此,空間復雜度為 O(k)

【LeetCode 熱題 100】239. 滑動窗口最大值——(解法三)滑動窗口+單調隊列+數組

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

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

相關文章

MySQL 8.0 連接 5.x 服務器認證問題

總的來說&#xff0c;答案是&#xff1a;可以&#xff0c;但是需要特別注意認證方式的兼容性問題。 MySQL 8.0 引入了新的默認認證插件 caching_sha2_password&#xff0c;而 MySQL 5.x&#xff08;及更早版本&#xff09;使用的是 mysql_native_password。當你用一個 8.0 的客…

Spring原理揭秘(一)

什么是spring&#xff1f; spring框架是一個輕量級的開源的JavaEE框架。 所謂輕量級則是&#xff1a;占用空間小&#xff0c;代碼侵入性低&#xff0c;代碼耦合度低&#xff0c;降低代碼復雜度&#xff0c;可以輕易適配多種框架。 隨著spring的不斷發展&#xff0c;它所占用…

Visual Studio Code自用搜索技巧整理

多文件跨行搜索 用途 在多個日志文件中搜索跨行日志 方法 1.用VS Code打開待搜索文件所在的目錄&#xff1b; 2.按快捷鍵&#xff08;CtrlShiftF&#xff09;打開全局搜索&#xff1b; 3.點擊搜索框右側的開啟正則表達式&#xff1b; 4.輸入正則表達式&#xff0c;例如&…

Axure PR 9 驗證碼登錄 案例

大家好&#xff0c;我是大明同學。 這期內容&#xff0c;我們來用Axure來制作一個短信驗證登錄頁面的小案例。 驗證碼登錄小案例 創建手機號輸入框所需的元件 1.打開一個新的 RP 文件并在畫布上打開 Page 1。 2.在元件庫中拖出一個矩形元件&#xff0c;選中矩形元件&#xf…

監聽器模式

1. 問題背景 假設我們有一個 銀行賬戶管理系統&#xff0c;該系統需要監控用戶賬戶余額的變動&#xff0c;并在發生變動時&#xff0c;自動執行一些相關的操作&#xff0c;比如發送 余額變動通知&#xff08;如短信、郵件等&#xff09;。為了實現這一功能&#xff0c;我們希望…

帕魯杯應急響應賽題:知攻善防實驗室

一、背景信息 在這個跳躍的數字舞臺上&#xff0c;數據安全成了政企單位穩航的重要壓艙石。某政企單位&#xff0c;作為一艘駛向未來 的巨輪&#xff0c;對數據的把控絲毫不敢松懈。眼下&#xff0c;我們即將啟航一場無與倫比的探險——“信息安全探索之 旅”。 這趟旅程的目的…

【硬核數學】2.2 深度學習的“微積分引擎”:自動微分與反向傳播《從零構建機器學習、深度學習到LLM的數學認知》

歡迎來到本系列的第七篇文章。在上一章&#xff0c;我們用張量武裝了我們的線性代數知識&#xff0c;學會了如何描述和操作神經網絡中的高維數據流。我們知道&#xff0c;一個神經網絡的“前向傳播”過程&#xff0c;就是輸入張量經過一系列復雜的張量運算&#xff08;矩陣乘法…

DAY 45 Tensorboard使用介紹

浙大疏錦行https://blog.csdn.net/weixin_45655710知識點回顧&#xff1a; tensorboard的發展歷史和原理tensorboard的常見操作tensorboard在cifar上的實戰&#xff1a;MLP和CNN模型 作業&#xff1a;對resnet18在cifar10上采用微調策略下&#xff0c;用tensorboard監控訓練過程…

2023年全國碩士研究生招生考試英語(一)試題總結

文章目錄 題型與分值分布完形填空錯誤 1&#xff1a;考察連詞 or 前后內容之間的邏輯關系錯誤2&#xff1a;錯誤3&#xff1a;錯誤4&#xff1a;這個錯得最有價值&#xff0c;因為壓根沒讀懂錯誤5&#xff1a;學到的短語&#xff1a; 仔細閱讀排序/新題型翻譯小作文大作文 題型…

react-數據Mock實現——json-server

什么是mock&#xff1f; 在前后端分離的開發模式下&#xff0c;前端可以在沒有實際后端接口的支持下先進行接口數據的模擬&#xff0c;進行正常的業務功能開發 json-server實現數據Mock json-server是一個node的包&#xff0c;可以在不到30秒內獲得零編碼的完整Mock服務 實現…

使用POI導入解析excel文件

首先校驗 /*** 校驗導入文件* param file 上傳的文件* return 校驗結果&#xff0c;成功返回包含成功狀態的AjaxResult&#xff0c;失敗返回包含錯誤信息的AjaxResult*/private AjaxResult validateImportFile(MultipartFile file) {if (file.isEmpty()) {return AjaxResult.er…

從0開始學習計算機視覺--Day06--反向傳播算法

盡管解析梯度可以讓我們省去巨大的計算量&#xff0c;但如果函數比較復雜&#xff0c;對這個損失函數進行微分計算會變得很困難。我們通常會用反向傳播技術來遞歸地調用鏈式法則來計算向量每一個方向上的梯度。具體來說&#xff0c;我們將整個計算過程的輸入與輸入具體化&#…

企業流程知識:《學習觀察:通過價值流圖創造價值、消除浪費》讀書筆記

《學習觀察&#xff1a;通過價值流圖創造價值、消除浪費》讀書筆記 作者&#xff1a;邁克魯斯&#xff08;Mike Rother&#xff09;&#xff0c;約翰舒克&#xff08;John Shook&#xff09; 出版時間&#xff1a;1999年 歷史地位&#xff1a;精益生產可視化工具的黃金標準&am…

Day02_C語言IO進程線程

01.思維導圖 02.將當前的時間寫入到time. txt的文件中&#xff0c;如果ctrlc退出之后&#xff0c;在再次執行支持斷點續寫 1.2022-04-26 19:10:20 2.2022-04-26 19:10:21 3.2022-04-26 19:10:22 //按下ctrlc停止&#xff0c;再次執行程序 4.2022-04-26 20:00:00 5.2022-04-26 2…

FFmpeg中TS與MP4格式的extradata差異詳解

在視頻處理中&#xff0c;extradata是存儲解碼器初始化參數的核心元數據&#xff0c;直接影響視頻能否正確解碼。本文深入解析TS和MP4格式中extradata的結構差異、存儲邏輯及FFmpeg處理方案。 &#x1f4cc; 一、extradata的核心作用 extradata是解碼必需的參數集合&#xff0…

【CV數據集介紹-40】Cityscapes 數據集:助力自動駕駛的語義分割神器

&#x1f9d1; 博主簡介&#xff1a;曾任某智慧城市類企業算法總監&#xff0c;目前在美國市場的物流公司從事高級算法工程師一職&#xff0c;深耕人工智能領域&#xff0c;精通python數據挖掘、可視化、機器學習等&#xff0c;發表過AI相關的專利并多次在AI類比賽中獲獎。CSDN…

SAP月結問題9-FAGLL03H與損益表中研發費用金額不一致(FAGLL03H Bug)

SAP月結問題9-FAGLL03H與損益表中研發費用金額不一致(S4 1709) 財務反饋&#xff0c;月結后核對數據時發現FAGLL03H導出的研發費用與損益表中的研發費用不一致&#xff0c;如下圖所示&#xff1a; 對比FAGLL03H與損益表對應的明細&#xff0c;發現FAGLL03H與損益表數據存在倍數…

HTML inputmode 屬性詳解

inputmode 是一個 HTML 屬性&#xff0c;用于指定用戶在編輯元素或其內容時應使用的虛擬鍵盤布局類型。它主要影響移動設備和平板電腦的輸入體驗。 語法 <input inputmode"value"> <!-- 或 --> <textarea inputmode"value"></texta…

軟考中級【網絡工程師】第6版教材 第1章 計算機網絡概述

考點分析&#xff1a; 本章重要程度&#xff1a;一般&#xff0c;為后續章節做鋪墊&#xff0c;有總體認識即可&#xff0c;選擇題1-2分高頻考點&#xff1a;OSI模型、TCP/IP模型、每個層次的功能、協議層次新教材變化&#xff1a;刪除網絡結構、刪除X.25、更新互聯網發展【基本…

Mysql事務與鎖

數據庫并發事務 數據庫一般都會并發執行多個事務&#xff0c;多個事務可能會并發的對相同的一批數據進行增刪改查操作&#xff0c;可能就會導致我們說的臟寫、臟讀、不可重復讀、幻讀這些問題。為了解決這些并發事務的問題&#xff0c;數據庫設計了事務隔離機制、鎖機制、MVCC多…