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

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

文章目錄

  • 整體思路
  • 完整代碼
  • 時空復雜度
    • 時間復雜度:O(N * k)
    • 空間復雜度:O(k)
  • 注意:暴力解會超時

整體思路

這段代碼的目的是解決經典的 “滑動窗口最大值” 問題。即,在一個整數數組 nums 中,找出一個大小為 k 的滑動窗口在從左到右移動時,每個窗口內的最大值。

該算法實現了一種 模擬滑動窗口 的暴力解法。它雖然使用了雙端隊列(Deque)這一數據結構,但并沒有發揮其在最優解法(單調隊列)中的關鍵作用,而是僅僅將其用作一個普通的隊列來存儲當前窗口內的所有元素。

其核心邏輯步驟如下:

  1. 初始化

    • 創建一個結果數組 ans,其長度為 n - k + 1,因為這正是滑動窗口的總數。
    • 創建一個雙端隊列 win,用來存儲當前滑動窗口中的所有元素。
  2. 滑動窗口模擬

    • 算法使用一個 for 循環,由 right 指針驅動,從左到右遍歷整個 nums 數組。right 代表窗口的右邊界。
    • 窗口維護
      a. 元素出隊(收縮窗口):當窗口已經形成并需要向右滑動時(即 right > k - 1,意味著要加入第 k+1 個元素了),就從隊列的頭部彈出一個元素(win.pop())。這模擬了窗口最左邊的元素移出窗口的過程。
      b. 元素入隊(擴張窗口):將當前 right 指針指向的元素 nums[right] 加入到隊列的尾部(win.add())。
    • 通過這兩步,win 隊列始終保持著當前滑動窗口內的所有元素。
  3. 查找當前窗口最大值(暴力法)

    • 【效率瓶頸】 在每次更新窗口后,代碼會進入一個內部的 for-each 循環,遍歷 win 隊列中的 所有元素,以線性掃描的方式找出當前窗口的最大值 max
    • 這是該算法效率不高的根本原因。
  4. 記錄結果

    • 當窗口首次形成(即 right >= k - 1)以及后續的每次滑動后,將上一步找到的最大值 max 存入結果數組 ans 的相應位置(ans[right - k + 1])。
  5. 返回結果

    • 遍歷結束后,返回填充好的 ans 數組。

總結來說,這是一個思路直接、易于理解的解法:用隊列維護窗口元素,每次滑動后,重新掃描整個窗口找到最大值。

完整代碼

class Solution {/*** 計算滑動窗口的最大值。* @param nums 整數數組* @param k 窗口大小* @return 包含每個窗口最大值的數組*/public int[] maxSlidingWindow(int[] nums, int k) {int n = nums.length;// 計算結果數組的長度,即滑動窗口的總數int m = n - k + 1;// ans 用于存儲每個窗口的最大值int[] ans = new int[m];// win 是一個雙端隊列,在此實現中被用作普通隊列來存儲當前窗口的所有元素Deque<Integer> win = new ArrayDeque<>(k); // 初始化容量為k// right 指針作為窗口的右邊界,遍歷整個數組for (int right = 0; right < n; right++) {// 當窗口大小即將超過 k 時,需要從左側移除一個元素// right > k - 1 意味著我們正要處理第 k+1 個元素(從0計數),此時窗口已滿if (right > k - 1) {// win.pop() 從隊列頭部移除元素,模擬窗口向右滑動win.pop();}// 將當前 right 指針指向的元素加入隊列尾部win.add(nums[right]);// 【效率瓶頸】// 在每次窗口更新后,暴力遍歷當前窗口中的所有元素以查找最大值int max = Integer.MIN_VALUE;for (int x : win) {// 使用三元運算符更新最大值max = max > x ? max : x;}// 當窗口大小達到 k 時,開始記錄結果// right >= k - 1 標志著第一個完整的窗口已經形成if (right >= k - 1) {// 計算當前窗口在結果數組 ans 中的索引ans[right - k + 1] = max;}}return ans;}
}

時空復雜度

時間復雜度:O(N * k)

  1. 外層循環for (int right = 0; right < n; right++) 遍歷整個輸入數組 nums,執行 N 次,其中 Nnums 的長度。
  2. 內層循環for (int x : win) 循環遍歷 win 隊列中的所有元素。win 隊列的大小始終保持在 k 或小于 k。在窗口形成后,其大小恒為 k。因此,這個內層循環每次執行的操作數是 O(k)
  3. 循環內部操作:隊列的 pop()add() 操作的平均時間復雜度都是 O(1)。

綜合分析
算法的總時間復雜度由外層循環和內層循環的乘積決定。外層循環執行 N 次,每次內部都進行一次 O(k) 的掃描。因此,總的時間復雜度為 N * O(k) = O(N * k)

空間復雜度:O(k)

  1. 主要存儲開銷:算法使用了一個雙端隊列 win 來存儲窗口內的元素。
  2. 空間大小win 隊列的大小最多為 k,因為它存儲的是一個大小為 k 的滑動窗口的元素。
  3. 結果數組ans 數組的大小是 N - k + 1,屬于 O(N) 級別。在復雜度分析中,輸出結果所占用的空間通常不計入 額外輔助空間(auxiliary space)

綜合分析
算法所需的額外輔助空間主要由 win 隊列決定。因此,其空間復雜度為 O(k)。如果把輸出數組也計算在內,則總空間為 O(N)。按照標準,我們通常只分析輔助空間,即 O(k)

注意:暴力解會超時

這個方法時間復雜度為O(N * k),會超時。

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

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

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

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

相關文章

攻防世界-MISC-red_green

知識點 1.pngLSB隱寫 步驟 方法一&#xff1a;zsteg 打開附件&#xff0c;是一張圖片&#xff0c;打開看不懂&#xff08;其實由兩種顏色構成&#xff0c;0和1&#xff09;&#xff0c;用zsteg查看&#xff0c;發現隱寫了一張jpg圖片&#xff0c;使用zsteg提取。打開jpg圖片…

歸因問答-如何進行自動評估

歸因模型函數g的形式化表示 輸入&#xff1a;用戶問題q 輸出&#xff1a;(a, p), 其中a為答案&#xff0c;p為原始文章中支持答案a的段落。 1&#xff09;單樣本歸因 針對輸入問題q&#xff0c;如何評估歸因模型g輸出中段落p是對答案a的正確歸因。 在論文arributed qa中&…

基于vue+View UI的組織機構選擇

1、效果 1、代碼 <template><Button type"primary" click"modal true">點擊選擇</Button><div v-if"selectedArr.length > 0"><p>已選擇項&#xff1a;</p><div v-for"(item, index) in sel…

人大金倉Kingbase數據庫KSQL 常用命令指南

人大金倉Kingbase數據庫KSQL 常用命令指南 1. 連接與基本操作 1.1 連接數據庫 # 基礎語法 ksql -U 用戶名 -d 數據庫名 -h 主機名 -p 端口號 # 示例 ksql -U system -d testdb -h 127.0.0.1 -p 543211.2 執行SQL腳本 # 基礎語法 ksql -U <用戶名> -W -f <SQL腳本文…

從萌芽到領航:廣州華銳互動的 AR 奮進之路?

在 AR 技術這片充滿無限可能的領域中&#xff0c;廣州華銳互動數字科技有限公司宛如一顆耀眼的新星&#xff0c;熠熠生輝。廣州華銳互動成立于 2008 年&#xff0c;在那個 AR 技術尚處于萌芽階段、大眾認知度還較低的時期&#xff0c;廣州華銳互動便憑借著前瞻性的戰略眼光和對…

redisson看門狗實現原理

Redisson 看門狗&#xff08;Watch Dog&#xff09;機制實現原理 Redisson 的 Watch Dog 機制是分布式鎖的核心組件之一&#xff0c;用于 自動續期 鎖的過期時間&#xff0c;防止業務邏輯執行時間超過鎖的持有時間&#xff0c;導致鎖提前釋放而引發并發問題。以下是其實現原理…

C++中explicit詳解

文章目錄 1. **防止隱式類型轉換**示例1&#xff1a;沒有使用explicit示例2&#xff1a;使用explicit 2. **防止拷貝初始化**示例1&#xff1a;沒有使用explicit示例2&#xff1a;使用explicit 3. **防止隱式類型轉換的鏈式調用**示例1&#xff1a;沒有使用explicit示例2&#…

代碼部落 20250629 CSP-J復賽 模擬賽

網址&#xff1a;代碼部落 一&#xff1a; 相濡以沫 β&#xff08;代碼請自寫&#xff09; 簽到題&#xff0c;如果a[i]<a[i1] a[i]a[i1],反之&#xff0c;直接輸出No 二 共同富裕&#xff08;代碼請自寫&#xff09; 簽到題&#xff0c;用sort前綴和 如果最富有的個…

零基礎學習RabbitMQ(5)--工作模式(1)

在前面的章節中我們簡單介紹過一些RabbitMQ的工作模式&#xff0c;RabbitMQ共提供了七種工作模式進行消息傳遞&#xff0c;這里我們來詳細介紹。 1. Simple(簡單模式) P&#xff1a;生產者 C&#xff1a;消費者 特點&#xff1a;一個生產者一個消費者&#xff0c;消息只能被…

Android Liunx ffmpeg交叉編譯

本文的交叉編譯在window上安裝VMware&#xff0c;使用Ubuntu20.4進行的編譯。 一、安裝NDK&#xff1a; 1、下載解壓&#xff1a; 在NDK 下載 | Android NDK | Android Developers下載Liunx平臺的NDK。 本人下載的是android-ndk-r27c-linux.zip版本的。 解壓android-ndk-r…

極海G32R501雙向數字電源解決方案 賦能AI服務器及電源應用創新

6月26日&#xff0c;Big-Bit商務網主辦的2025中國電子熱點解決方案創新峰會在東莞召開&#xff0c;峰會以“核心智變、能效躍遷”為主題&#xff0c;聚焦光儲充、800V超充、AI服務器、BMS、智能汽車照明與汽車中小電機電控應用。 峰會期間&#xff0c;珠海極海半導體有限公司&a…

【修電腦的小記錄】連不上網

問題概述 問題表現為&#xff1a;電腦連接網絡后&#xff0c;顯示已連接但無法上網。 環境信息&#xff1a; - DNS 修改無效&#xff0c;ping 外網&#xff08;8.8.8.8&#xff09;失敗 - 嘗試重置網絡參數、多種命令無果 &#x1f50d; 排查過程 1. 執行以下命令重置網絡&a…

QT中QSS樣式表的詳細介紹

轉自個人博客 **Qt樣式表&#xff08;Qt Style Sheets&#xff0c;簡稱QSS&#xff09;**是一種類似于HTML中的CSS&#xff08;層疊樣式表&#xff09;的機制&#xff0c;用于自定義Qt應用程序的外觀。通過QSS&#xff0c;開發者可以輕松地修改控件的外觀&#xff0c;而無需更改…

Spring 依賴注入:官方推薦方式及最佳實踐

Spring 依賴注入&#xff1a;官方推薦方式及最佳實踐 你正在遭遇以下困境嗎&#xff1f; 項目變大后&#xff0c;依賴關系像一團亂麻&#xff0c;牽一發而動全身&#xff1f;單元測試難如登天&#xff0c;被迫啟動整個Spring容器&#xff1f;NullPointerException 總在運行時突…

javaweb聽課筆記day1

MySQL數據模型 關系型數據庫: 通過表來存儲數據 關系型數據庫是建立在關系模型基礎上的數據庫&#xff0c;簡單說&#xff0c;關系型數據庫是由多張能互相連接的二維表組成的數據庫 優點: 都是使用表結構&#xff0c;格式一致&#xff0c;易于維護;使用通用的SQL語言操作…

《從量子奇境到前端優化:解鎖卡西米爾效應的隱藏力量》

卡西米爾效應由荷蘭物理學家亨德里克卡西米爾于1948年提出&#xff0c;它源于量子場論中“真空不空”的奇異觀點。在傳統認知里&#xff0c;真空是一片虛無&#xff0c;但量子理論指出&#xff0c;真空中充滿了持續漲落的能量&#xff0c;即零點能。想象有兩片中性的金屬板被放…

【學習筆記】強化學習的數學原理

軟活硬整&#xff0c;納什又把RL翻出來講了一遍&#xff0c;我以為是溫故而知新&#xff0c;原來是在賣書。 不過溫故而知新還是沒啥毛病的。 PS&#xff1a;今天裝Notepad時看到的&#xff0c;我還以為現在連用個Notepad都要給天線寶寶們捐款了。 文章目錄 PART 11 overview…

深入“火星棒球數據API”:用數據解鎖棒球世界的無限可能

在棒球運動日益數據化的今天&#xff0c;高效獲取和處理海量比賽信息已成為球隊制勝、媒體解讀、球迷深入理解比賽的關鍵。“火星棒球數據API” 應運而生&#xff0c;成為連接棒球智慧與大數據技術的橋梁。本文將探討這一API的核心價值、功能亮點及其如何重塑我們體驗和分析棒球…

[附源碼+數據庫+畢業論文]基于Spring+MyBatis+MySQL+Maven+jsp實現的校園服務平臺管理系統,推薦!

摘 要 現代經濟快節奏發展以及不斷完善升級的信息化技術&#xff0c;讓傳統數據信息的管理升級為軟件存儲&#xff0c;歸納&#xff0c;集中處理數據信息的管理方式。本校園服務平臺管理系統就是在這樣的大環境下誕生&#xff0c;其可以幫助管理者在短時間內處理完畢龐大的數據…

「Java EE開發指南」如何用MyEclipse創建一個WEB項目?(三)

在本文中&#xff0c;您可以找到有關WEB項目的信息。將了解&#xff1a; Web項目結構和參數Web開發生產力工具JSP代碼完成和驗證 這些特性在MyEclipse中可用。在上文中&#xff08;點擊這里回顧>>&#xff09;&#xff0c;我們為大家介紹了Web開發效率工具、Web項目參數…