力扣hot100:滑動窗口最大值優化策略及思路講解(239)

記錄一下今天完成的算法題,雖然這個難度是困難,但感覺沒有那個560.和為k的子數組和難想,這個題主要就前期遇到個優先隊列,因為之前沒用過,不太熟悉,剩下的思路感覺都屬于正常難度
問題描述

原始思路:優先隊列(最大堆)

原始代碼使用最大堆(PriorityQueue)存儲元素值及其索引,堆頂始終是當前窗口的最大值。但原始代碼存在邏輯錯誤,修正后的代碼如下:

import java.util.PriorityQueue;public class Solution {public int[] maxSlidingWindow(int[] nums, int k) {if (nums.length == 0) return new int[0];PriorityQueue<int[]> pq = new PriorityQueue<>((a, b) -> b[0] - a[0]); // 最大堆// 初始化第一個窗口for (int i = 0; i < k; i++) {pq.offer(new int[]{nums[i], i});}int[] result = new int[nums.length - k + 1];result[0] = pq.peek()[0]; // 第一個窗口的最大值// 滑動窗口for (int i = k; i < nums.length; i++) {pq.offer(new int[]{nums[i], i}); // 1. 加入新元素while (pq.peek()[1] < i - k + 1) {  // 2. 彈出不在窗口內的元素pq.poll();}result[i - k + 1] = pq.peek()[0]; // 3. 記錄當前窗口最大值}return result;}
}

核心邏輯
  1. 初始化堆:將第一個窗口的元素?[值, 索引]?加入最大堆。
  2. 滑動窗口
    • 加入新元素:將窗口右側新元素加入堆。
    • 清理無效元素:彈出堆頂所有索引小于?i - k + 1?的元素(這些元素已離開窗口)。
    • 記錄最大值:堆頂元素即為當前窗口最大值。

復雜度分析
  • 時間復雜度O(n log n)?每個元素入堆和出堆需?O(log n),最壞情況下(如單調遞增數組)堆中元素累積至?O(n)
  • 空間復雜度O(n)
缺陷
  • 無效元素積累:堆中可能保留大量已離開窗口的元素,導致堆操作效率降低。

在此之上,我們延續優先隊列的思路,對代碼進行一下優化

優化方案1:單調隊列(雙端隊列)

使用雙端隊列(Deque)維護一個嚴格遞減的序列,隊首始終是當前窗口最大值。時間復雜度優化至 O(n)

import java.util.Deque;
import java.util.LinkedList;public class Solution {public int[] maxSlidingWindow(int[] nums, int k) {if (nums.length == 0) return new int[0];Deque<Integer> deque = new LinkedList<>(); // 存儲索引int[] result = new int[nums.length - k + 1];for (int i = 0; i < nums.length; i++) {// 1. 清理超出窗口的隊首元素while (!deque.isEmpty() && deque.peekFirst() < i - k + 1) {deque.pollFirst();}// 2. 從隊尾移除小于當前元素的索引while (!deque.isEmpty() && nums[deque.peekLast()] < nums[i]) {deque.pollLast();}deque.offerLast(i); // 3. 當前索引入隊// 4. 記錄窗口最大值(從第k-1個元素開始)if (i >= k - 1) {result[i - k + 1] = nums[deque.peekFirst()];}}return result;}
}

核心改進
  1. 嚴格遞減隊列:?每次添加新元素時,從隊尾移除所有小于它的元素索引,確保隊列嚴格遞減。
  2. 隊首即最大值:?隊首對應元素始終為當前窗口最大值。
  3. 即時清理無效元素:?在添加新元素前,先清理離開窗口的隊首元素,避免無效積累。
復雜度分析
  • 時間復雜度O(n)?每個元素最多入隊和出隊一次。
  • 空間復雜度O(k)?隊列最多存儲?k?個元素。
優化方案2:分塊預處理(空間換時間)

將數組分成大小為 k 的塊,預處理每個塊的 前綴最大值后綴最大值,利用二者快速計算窗口最大值。

public class Solution {public int[] maxSlidingWindow(int[] nums, int k) {if (nums.length == 0) return new int[0];int n = nums.length;int[] prefixMax = new int[n];int[] suffixMax = new int[n];// 計算前綴最大值for (int i = 0; i < n; i++) {prefixMax[i] = (i % k == 0) ? nums[i] : Math.max(prefixMax[i - 1], nums[i]);}// 計算后綴最大值suffixMax[n - 1] = nums[n - 1];for (int i = n - 2; i >= 0; i--) {suffixMax[i] = ((i + 1) % k == 0) ? nums[i] : Math.max(suffixMax[i + 1], nums[i]);}// 計算每個窗口最大值int[] result = new int[n - k + 1];for (int i = 0; i <= n - k; i++) {result[i] = Math.max(suffixMax[i], prefixMax[i + k - 1]);}return result;}
}

核心邏輯
  1. 前綴最大值:?prefixMax[i]?= 從塊起點到?i?的最大值。
  2. 后綴最大值:?suffixMax[i]?= 從?i?到塊終點的最大值。
  3. 窗口最大值:?設窗口為?[i, j]j = i + k - 1),則最大值 =?max(suffixMax[i], prefixMax[j])
復雜度分析
  • 時間復雜度O(n)?預處理和計算結果各需遍歷一次數組。
  • 空間復雜度O(n)?需額外存儲前綴和后綴最大值數組。
總結
方法時間復雜度空間復雜度核心優勢
優先隊列(修正)O(n log n)O(n)邏輯簡單,易實現
單調隊列O(n)O(k)最優效率,推薦使用
分塊預處理O(n)O(n)無隊列操作,適合并行計算

推薦實現單調隊列法在性能和代碼簡潔性上達到最佳平衡,是解決滑動窗口最大值問題的首選方案。

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

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

相關文章

“互聯網 +”時代下開源 AI 大模型 AI 智能名片 S2B2C 商城小程序:行業變革與未來展望

摘要&#xff1a;在“互聯網 ”浪潮的推動下&#xff0c;各行業正經歷著深度融合與變革。互聯網、新零售、云計算等新興技術成為行業發展的關鍵驅動力。本文聚焦開源 AI 大模型 AI 智能名片 S2B2C 商城小程序這一創新模式&#xff0c;分析其在“互聯網 ”背景下的內涵與優勢&am…

ROS2通信機制實戰——從“單向傳數據”到“雙向發請求”(二)

第2天&#xff1a;ROS2通信機制實戰——從“單向傳數據”到“雙向發請求” 做機器人開發時&#xff1a;“為什么控制機器人前進用話題&#xff0c;而讓機器人報位置要用服務&#xff1f;”其實答案很簡單——ROS2的通信機制是“按需設計”的&#xff1a;話題適合高頻、單向的數…

Function Calling(智能客服)

目錄 1.0.思路分析 1.1.基礎CRUD 1.1.1.數據庫表 1.1.2.引入依賴 1.1.3.配置數據庫 1.1.4.基礎代碼 2.定義Function 2.1.課程表的字段&#xff1a; 2.2.定義Function 2.3.System提示詞 2.4.配置ChatClient 3.編寫Controller 3.1.解決兼容性問題 3.2.AlibabaOpenA…

探索淀粉深加工的無限可能:2026 濟南展覽會前瞻

在全球農產品加工的廣闊版圖中&#xff0c;淀粉深加工產業猶如一顆璀璨的明珠&#xff0c;散發著日益耀眼的光芒。其產品廣泛滲透于食品、飲料、醫藥、化工、能源等諸多領域&#xff0c;宛如一條條無形的紐帶&#xff0c;將各個行業緊密相連。隨著技術的日新月異、政策的大力扶…

STAGEWISE實戰指南:從集成到使用的完整解決方案

文章目錄 一、前言 二、集成STAGEWISE的實戰過程 1. 初始配置問題 2. 依賴沖突處理 3. 組件導入問題 四、標準集成方案 1. 完整安裝步驟 2. Vue項目集成步驟 (1) 修改App.vue文件 (2) 配置文件說明 五、最佳實踐 1. 開發規范 2. 常見問題排查 五、總結 一、前言 在前端開發中,…

使用astah制作專業狀態圖及C/C++實現解析

<摘要> 本文詳細解析如何使用astah專業工具繪制高質量的UML狀態圖&#xff0c;并建立與C/C代碼的完整映射關系。內容涵蓋狀態圖核心概念、astah工具實操指南、觸發機制(Trigger)、守衛條件(Guard)和動作(Action)的代碼實現解析&#xff0c;并通過一個完整的用戶登錄狀態機…

C語言————函數遞歸(通俗易懂)

我們在學習些新的函數時&#xff0c;首先我們得理解它是什么&#xff1f;是怎么定義的&#xff1f;然后去了解他的用途&#xff0c;最后我們自己要會用&#xff0c;知道用在什么地方&#xff1f;什么時候用&#xff1f;用的時候要注意些什么&#xff1f;有一個條理清晰的學習邏…

路由基礎(三):靜態路由、動態路由、默認路由

靜態路由 靜態路由&#xff1a;管理員使用手工方式為路由器添加路由 三種添加靜態路由的方式&#xff1a; 配置下一跳配置出接口出接口和下一跳都配置 備注&#xff1a;不配置出接口時&#xff0c;路由器會進行路由遞歸查詢 #添加去往10.1.1.0網段的靜態路由&#xff0c;下一跳…

大模型開發之:LangChain4j【附資料】

什么是 LangChain4j&#xff1f; LangChain4j 是一個專為 Java 生態系統設計的開源&#xff08;Apache 2.0 許可&#xff09;框架&#xff0c;用于簡化基于大語言模型&#xff08;LLM&#xff09;的應用程序開發。它的名字和靈感來源于其"前輩"——為 Python 設計的 …

SyntaxError: Failed to execute ‘open‘ on ‘XMLHttpRequest‘: Invalid URL

這就是在ajax請求的時候URL不正確&#xff0c; 例如&#xff1a; http://192.168.124.168:8082api/v1/task/get 正確的是這樣的&#xff1a; http://192.168.124.168:8082/api/v1/task/get 這個錯誤的來源是 baseUrl apiUrl 導致的&#xff0c; 比如baseUrl http://19…

程序代碼篇---類

為什么有類&#xff1a;要理解編程語言中為什么會有 “類”&#xff0c;我們可以從日常生活的例子入手。想象你要描述 “汽車” 這個事物&#xff1a;它有屬性&#xff08;顏色、品牌、排量&#xff09;它有行為&#xff08;行駛、剎車、鳴笛&#xff09;如果沒有類&#xff0c…

jenkins備份遷移

1、確認Jenkins版本 在web界面操作步驟&#xff1a;登錄Jenkins管理控制臺點擊左上角"Jenkins"圖標選擇"Manage Jenkins" > "About Jenkins"在頁面中查看"Version"字段顯示的具體版本號&#xff08;如2.479.2&#xff09; 建議截圖…

Video Ocean 接入 GPT-5

Video Ocean&#xff1a;全球首個接入 GPT-5 的視頻智能體引領 AI 視頻創作革命 一、技術全景&#xff1a;Video Ocean 的架構與創新 1.1 全球首個 GPT-5 視頻智能體的技術突破 Video Ocean 作為全球首個接入 GPT-5 的視頻智能體&#xff0c;代表了 AI 視頻生成領域的重大突…

如何在API高并發中玩轉資源隔離與限流策略?

url: /posts/4ad4ec1dbd80bcf5670fb397ca7cc68c/ title: 如何在API高并發中玩轉資源隔離與限流策略? date: 2025-08-27T23:26:45+08:00 lastmod: 2025-08-27T23:26:45+08:00 author: cmdragon summary: 資源隔離是保障API穩定性的核心,通過路由隔離和依賴隔離實現關鍵業務與…

Swift 解法詳解 LeetCode 365:水壺問題

文章目錄摘要描述題解答案題解代碼分析代碼拆解示例測試及結果時間復雜度空間復雜度總結摘要 這道題其實就是經典的 “兩個水壺問題”&#xff0c;你可能在電影《虎膽龍威3》里見過&#xff0c;布魯斯威利斯用兩個水壺精確量出 4 升水來解除炸彈。這題就是把那個場景搬到了編程…

Redis集群介紹——主從、哨兵、集群

Redis集群介紹 集群里有三大模式&#xff1a; Redis主從模式&#xff1a;一主一從或一主多從&#xff0c;自帶讀寫分離&#xff0c;負載均衡&#xff1b; Redis哨兵模式&#xff1a;高可用&#xff0c;主服務器宕機&#xff0c;從服務器變為主服務器&#xff1b; Redis集群…

【大前端】封裝一個React Native與Android/IOS 端通用的埋點接口

RN 層只暴露一個統一的埋點方法&#xff0c;例如 trackEvent(eventName, params)&#xff0c;內部通過 NativeModule 調用 Android/iOS 的原生埋點 SDK。這樣 RN 層不用關心具體實現。寫一個通用的示例&#xff1a;1. RN 層封裝統一接口&#xff08;JS 代碼&#xff09;// anal…

詳解 外部負載均衡器 → Ingress Controller Pod 這個過程

在常見的生產架構中&#xff1a; 外部負載均衡器&#xff08;Ng/ELB/ALB/NLB等&#xff09;終止來自客戶端的 HTTPS 連接。 它將解密后的明文 HTTP 請求轉發給后端的 Kubernetes Ingress Controller Pods。 Ingress Controller 處理 HTTP 請求&#xff0c;并將 HTTP 響應返回給…

Markdown 編輯器 語法

這里寫自定義目錄標題歡迎使用Markdown編輯器新的改變功能快捷鍵合理的創建標題&#xff0c;有助于目錄的生成如何改變文本的樣式插入鏈接與圖片如何插入一段漂亮的代碼片生成一個適合你的列表創建一個表格設定內容居中、居左、居右SmartyPants創建一個自定義列表如何創建一個注…

【PyTorch項目實戰】SAM(Segment Anything Model) —— 致力于建立第一個圖像分割基礎模型

文章目錄一、SAM&#xff08;Segment Anything Model&#xff09; —— 致力于建立第一個圖像分割基礎模型&#xff08;Foundation Model&#xff09;1、項目背景2、核心任務設計3、模型架構&#xff1a;圖像編碼器 提示編碼器 掩碼解碼器4、核心創新&#xff1a;可提示分割任…