力扣經典題目解析--滑動窗口最大值

原題地址:?. - 力扣(LeetCode)

給你一個整數數組?nums,有一個大小為?k?的滑動窗口從數組的最左側移動到數組的最右側。你只可以看到在滑動窗口內的?k?個數字。滑動窗口每次只向右移動一位。

返回?滑動窗口中的最大值?

示例 1:

輸入:nums = [1,3,-1,-3,5,3,6,7], k = 3
輸出:[3,3,5,5,6,7]
解釋:
滑動窗口的位置                最大值
---------------               -----
[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

示例 2:

輸入:nums = [1], k = 1
輸出:[1]

暴力法

這道題相比較其他題目可以說簡單易懂,找到滑動窗口中最大值就行了。先定義一個結果數組result,長度是nums.length - k + 1,再確定遍歷的數組大小是0到nums.length - k,最后遍歷[i,i+k]的窗口,找到最大值存入result中就行了。

public int[] maxSlidingWindow(int[] nums, int k) {// 結果數組,存放結果int[] result = new int[nums.length - k + 1];for (int i = 0; i <= nums.length - k; i++) {int max = nums[i];for (int j = i; j < i + k; j++) {if (nums[j] > max) {max = nums[j];}}result[i] = max;}return result;
}

?但是我們來看下這道題的難度,是困難級別,可想而知不會這么簡單

果然跑到40個用例的時候直接超出時間限制了,這時的滑動窗口寬度是26779.

雙向隊列?

我們發現,窗口在滑動過程中,其實數據發生的變化很小:只有第一個元素被刪除、后面又新增一個元素,中間的大量元素是不變的。也就是說,前后兩個窗口中,有大量數據是 重疊 的。

[1, 3, -1,] -3, 5, 3, 6, 7

1, [3, -1, -3,] 5, 3, 6, 7

1, 3, [-1, -3, 5,] 3, 6, 7

自然想到,其實可以使用一個 隊列 來保存窗口數據:窗口每次滑動,我們就讓后面的一個元素(-3)進隊,并且讓第一個元素(1)出隊。進出隊列的操作,只要耗費常數時間。

這種場景,可以使用 雙向隊列(也叫雙端隊列Dequeue),該數據結構可以從兩端以常數時間壓入/彈出元素。

在構建雙向隊列的時候,可以采用刪除隊尾更小元素的策略,所以,得到的其實就是一個 從大到小排序 的隊列。

這樣存儲的元素,可以認為是遵循“更新更大”原則的。

public int[] maxSlidingWindow1(int[] nums, int k) {if (k == 1) return nums;// 結果數組,存放結果int[] result = new int[nums.length - k + 1];Deque<Integer> deque = new ArrayDeque<>();// 初始化隊列,隊列里面記錄indexfor (int i = 0; i < k; i++) {// 比較將要放入的數與隊列最后一個數,如果小于將要放入的數則刪除// 最后會得到一個從大到小排列的隊列while (!deque.isEmpty() && nums[i] > nums[deque.getLast()]) {deque.removeLast();}deque.addLast(i);}// 第一個數最大result[0] = nums[deque.getFirst()];for (int i = k; i < nums.length; i++) {// 判斷隊列中第一個是否要出窗口if (i - k == deque.getFirst()) deque.removeFirst();// 入隊列while (!deque.isEmpty() && nums[i] > nums[deque.getLast()]) {deque.removeLast();}deque.addLast(i);result[i - k + 1] = nums[deque.getFirst()];}return result;
}

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

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

相關文章

小程序自定義組件

自定義組件 1. 創建-注冊-使用組件 組件介紹 小程序目前已經支持組件化開發&#xff0c;可以將頁面中的功能模塊抽取成自定義組件&#xff0c;以便在不同的頁面中重復使用&#xff1b; 也可以將復雜的頁面拆分成多個低耦合的模塊&#xff0c;有助于代碼維護。 開發中常見的…

111790-37-5 ,生物素-氨基,一種生物素化合物,可與-NHS、-COOH反應

您好&#xff0c;歡迎來到新研之家 文章關鍵詞&#xff1a;111790-37-5 &#xff0c;生物素-氨基&#xff0c;生物素氨基&#xff0c;Biotin-NH2&#xff0c;Biotin-amine 一、基本信息 【產品簡介】&#xff1a;Biotin-NH2 provides a convenient biotinylation method for…

OSCP靶場--DVR4

OSCP靶場–DVR4 考點(1.windows&#xff1a;路徑遍歷獲取私鑰getshell 2.ssh shell中runas切換用戶) 1.nmap掃描 ┌──(root?kali)-[~/Desktop] └─# nmap -sV -sC -p- 192.168.161.179 --min-rate 2000 Starting Nmap 7.92 ( https://nmap.org ) at 2024-02-29 07:14 EST…

Springboot接口參數校驗

在設計接口時我們通常需要對接口中的非法參數做校驗&#xff0c;以降低在程序運行時因為一些非法參數而導致程序發生異常的風險&#xff0c;例如登錄的時候需要校驗用戶名密碼是否為空&#xff0c;創建用戶的時候需要校驗郵件、手機號碼格式是否準確。如果在代碼中對接口參數一…

系統集成Prometheus+Grafana

根據產品需求在自己的系統中添加一個系統監控的頁面&#xff0c;其中有主機信息的顯示&#xff0c;也有一些業務信息的顯示。調研后的方案是 主機信息通過Prometheus采集和存儲&#xff0c;業務信息通過自己系統的調度任務統計后存儲在Mysql中&#xff0c;使用Grafana對接Prome…

Java必須掌握的繼承的特點和繼承體系的設計(含面試大廠題和源碼)

Java繼承是面向對象編程的一個基本特性&#xff0c;它允許一個類繼承另一個類的屬性和方法。設計良好的繼承體系是高質量軟件開發的關鍵。在大廠面試中&#xff0c;面試官可能會詢問關于Java繼承特點及如何設計一個合理的繼承體系的問題&#xff0c;以評估你的面向對象設計能力…

ICLR 2024|ReLU激活函數的反擊,稀疏性仍然是提升LLM效率的利器

論文題目&#xff1a; ReLU Strikes Back: Exploiting Activation Sparsity in Large Language Models 論文鏈接&#xff1a; https://arxiv.org/abs/2310.04564 參數規模超過十億&#xff08;1B&#xff09;的大型語言模型&#xff08;LLM&#xff09;已經徹底改變了現階段人工…

gcc和g++的區別,如何看自己的編譯器支持的C++的版本

gcc和g的區別 用一句話來說&#xff0c;就是gcc將程序視為c語言的&#xff0c;g將程序視為C的 gcc和g的區別主要在于它們處理不同后綴的文件類型、編譯和連接階段的不同調用方式&#xff0c;以及它們對C特性的支持方式。以下是詳細介紹&#xff1a;123 文件類型。gcc將后綴為…

通過多線程并發方式實現服務器

與多進程實現對比來看。 示例來源于網絡視頻 #include <stdio.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> #include <ctype.h> #include <unistd.h> #include <fcntl.h>#include "wrap.h"#de…

【C++ 測試】

C 測試 一、二維數組二、私有成員三、function用法四、類里面創建另一個類五、lambda六、Map動態申請 一、二維數組 #include <iostream> #include<windows.h> #include <map> // SetConsoleOutputCP ( CP_UTF8 ) ; using namespace std;void test1() {map…

求最短路徑之迪杰斯特拉算法

對fill用法的介紹 1.用鄰接矩陣實現 const int maxn100; const int INF100000000;//無窮大&#xff0c;用來初始化邊 int G[maxn][maxn];//用鄰接矩陣存儲圖的信息 int isin[maxn]{false};//記錄是否已被訪問 int minDis[maxn];//記錄到頂點的最小距離void Dijkstra(int s,in…

網格圖的搜索

來自靈神網格圖題單。 1. 網格圖 1.1. LC 200 島嶼數量 這題我一開始想繁了&#xff0c;想維護并查集&#xff0c;然后看等價類個數。其實完全沒有必要。因為連通分量深搜到頭就可以直接給答案計數1。利用vis數組維護訪問過的點&#xff0c;然后碰到新連通分量重新深搜即可。…

Pinia使用

官方地址&#xff1a;Pinia | The intuitive store for Vue.js (vuejs.org)https://pinia.vuejs.org/ 1.安裝 npm install pinia npm install pinia-plugin-persistedstate Pinia是一個基于Vue 3的狀態管理庫&#xff0c;它使得管理Vue的全局狀態變得更加容易和直觀。 而…

自定義el-dialog的樣式

實現效果&#xff1a; 樣式代碼如下&#xff1a;&#xff08;可以寫在common.scss文件夾中&#xff09; .el-dialog__header {padding: 16px 20px;border-bottom: 1px solid #DCDFE6;display: flex;align-items: center;.el-dialog__title {font-size: 16px;position: relativ…

utniy urp shinyssrr插件使用

文章目錄 前言步驟1首先在URP的配置文件里添加SSR后處理2 修改RenderingPath為延遲渲染3 啟用深度紋理4 為物體添加腳本 插件下載 前言 用來實現屏幕空間反射效果 unity 版本為2021.3.8LTS&#xff0c;低版本的untiy URP的參數設置位置z可能會不同 步驟 1首先在URP的配置文件…

記錄阿里云換源失敗的慘痛教訓

聲明 首先我不是一個云服務器小白&#xff0c;但是之前一直在使用騰訊云和火山引擎的云服務器。從未見過阿里云這樣如此**的運營商。 問題 服務器到手&#xff0c;第一步在我進行sudo apt update的時候&#xff0c;也就是更新軟件包的時候&#xff0c;我發現&#xff0c;一直…

1028. 從先序遍歷還原二叉樹(三種方法:棧+遞歸+集合)

文章目錄 1028. 從先序遍歷還原二叉樹&#xff08;三種方法&#xff1a;棧遞歸集合&#xff09;一、棧 while迭代1.思路2.代碼 二、遞歸法1.思路2.代碼 三、集合存儲1.思路2.代碼 1028. 從先序遍歷還原二叉樹&#xff08;三種方法&#xff1a;棧遞歸集合&#xff09; 一、棧 wh…

hive報錯:FAILED: NullPointerException null

發現問題 起因是我虛擬機的hive不管執行什么命令都報空指針異常的錯誤 我也在網上找了很多相關問題的資料&#xff0c;發現都不是我這個問題的解決方法&#xff0c;后來在hive官網上與hive 3.1.3版本相匹配的hadoop版本是3.x的版本&#xff0c;而我的hadoop版本還是2.7.2的版本…

HTTPS的加密過程

文章目錄 前言一、為什么需要加密&#xff1f;二、只用對稱加密可以嗎&#xff1f;三、只使用非對稱加密四、雙方都使用非對稱加密五、使用非對稱加密對稱加密六、引入證書1.如何放防止數字證書被篡改&#xff1f;2.中間人有可能篡改該證書嗎&#xff1f;3.中間人有可能掉包該證…

開窗函數rank() over,dense_rank() over,row_number() over的區別

1.rank() over 查詢出指定的條件進行排名&#xff0c;條件相同排名相同的話&#xff0c;排名之間是不連續的 例如排名如 1 2 3 3 5 6 7 等&#xff0c;相同的排名會自動跳過 2.dense_rank() over 查詢出指定的條件后進行排名&#xff0c;條件相同&#xff0c;排名相同的話&…