#2495. 滑動窗口 /【模板】單調隊列

題目描述

有一個長為 ( n ) 的序列 ( a ),以及一個大小為 ( k ) 的窗口。現在這個窗口從左邊開始向右滑動,每次滑動一個單位,求出每次滑動后窗口中的最大值和最小值。例如:

數組是 ([1, 3, -1, -3, 5, 3, 6, 7]), ( k = 3 )。

輸入格式

輸入一共有兩行:

第一行有兩個正整數 ( n ) 和 ( k )。

第二行有 ( n ) 個整數,表示序列 ( a )。

輸出格式

輸出共兩行:

第一行為每次窗口滑動的最小值。

第二行為每次窗口滑動的最大值。

樣例

輸入數據 1
8 3
1 3 -1 -3 5 3 6 7
輸出數據 1
-1 -3 -3 -3 3 3
3 3 5 5 6 7

提示

數據范圍:

  • 對于 50% 的數據,( 1 \leq n \leq 10^5 )
  • 對于 100% 的數據,( 1 \leq k \leq n \leq 10^6 ),( a_i \in [-2^{31}, 2^{31}) )

參考代碼:雙端隊列實現

#include <bits/stdc++.h>using namespace std;constexpr int N = 1e6 + 7;int a[N], n, k;int main() {cin >> n >> k;for (int i = 0; i < n; i++) cin >> a[i];// 存的是下標// 我們的dq里面一定是單調// 你要么活得比我長// 要么能力比我強deque<int> dq;for (int i = 0; i < n; i++) {// 當前隊首的這個點還存活不 --- 窗口長度k// 比如我當前位置是i,窗口長度是3// 可以存在的點是i, i - 1, i - 2if (!dq.empty() && i - k + 1 > dq.front()) {// 比如我現在的i = 6,k = 3 --- 4 5 6三個位置的數// 但是你的dq.frond() = 3,你隊首是位置為3的元素// 已經過了你的時代 --- 你該下位了dq.pop_front();}// 我a[i]要把我前面能力沒我強,活的沒我久的全部干掉// 隊列里如果活得沒有a[i]久,能力沒有a[i]強,a[i]在的一天他們就永無出頭之日while (!dq.empty() && a[i] <= a[dq.back()]) dq.pop_back();dq.push_back(i);// 可以輸出當前的最小值了 --- 窗口長度至少得達到k才可以開始輸出if (i >= k - 1) cout << a[dq.front()] << " ";}cout << "\n";dq.clear();for (int i = 0; i < n; i++) {// 當前隊首的這個點還存活不 --- 窗口長度k// 比如我當前位置是i,窗口長度是3// 可以存在的點是i, i - 1, i - 2if (!dq.empty() && i - k + 1 > dq.front()) {// 比如我現在的i = 6,k = 3 --- 4 5 6三個位置的數// 但是你的dq.frond() = 3,你隊首是位置為3的元素// 已經過了你的時代 --- 你該下位了dq.pop_front();}// 我a[i]要把我前面能力沒我強,活的沒我久的全部干掉// 隊列里如果活得沒有a[i]久,能力沒有a[i]強,a[i]在的一天他們就永無出頭之日while (!dq.empty() && a[i] >= a[dq.back()]) dq.pop_back();dq.push_back(i);// 可以輸出當前的最小值了 --- 窗口長度至少得達到k才可以開始輸出if (i >= k - 1) cout << a[dq.front()] << " ";}cout << "\n";return 0;
}

參考代碼:手寫單調隊列

#include <bits/stdc++.h>using namespace std;constexpr int N = 1e6 + 7;int a[N], dq[N];int n, k, head = 0, tail = -1;bool isNotEmpty() { return head <= tail; }int top() { return dq[head]; }void pop_front() { head += 1; }int back() { return dq[tail]; }void pop_back() { tail -= 1; }void push(int x) { dq[++tail] = x; }int main() {cin >> n >> k;for (int i = 0; i < n; i++) cin >> a[i];for (int i = 0; i < n; i++) {if (isNotEmpty() && i - k + 1 > top()) pop_front();while (isNotEmpty() && a[back()] >= a[i]) pop_back();push(i);if (i >= k - 1) cout << a[top()] << " ";}cout << "\n";head = 0, tail = -1;for (int i = 0; i < n; i++) {if (isNotEmpty() && i - k + 1 > top()) pop_front();while (isNotEmpty() && a[back()] <= a[i]) pop_back();push(i);if (i >= k - 1) cout << a[top()] << " ";}cout << "\n";return 0;
}

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

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

相關文章

【深度強化學習】關于同一設備上cuda和gpu計算結果不一致問題

文章目錄 問題描述關于seed: 跟原文一致補充:萬能seed 問題結論cpu和gpu差異來源分析浮點數精度的差異補充報錯&#xff1a;Expected all tensors to be on the same device&#xff01;常見運算上的差異累加運算的差異exp運算的差異matmul運算的差異 forward上的差異&#xff…

【LeetCode 隨筆】面試經典 150 題【中等+困難】持續更新中。。。

文章目錄 189. 輪轉數組122. 買賣股票的最佳時機 II55. 跳躍游戲45. 跳躍游戲 II274. H 指數 &#x1f308;你好呀&#xff01;我是 山頂風景獨好 &#x1f49d;歡迎來到我的博客&#xff0c;很高興能夠在這里和您見面&#xff01; &#x1f49d;希望您在這里可以感受到一份輕松…

機器學習云環境搭建

在 https://support.huaweicloud.com/browsertg-obs/obs_03_1003.html 下載對應版本的 OBS Broswer 軟件&#xff0c;如圖&#xff0c;紅框內的為安裝文件&#xff0c;藍色框內的為對應安裝文件的校驗文件&#xff08;無需下載&#xff09; 以 64 位機為例&#xff0c;下載完…

景源暢信電商:抖店需要的成本高嗎?

在數字化時代的浪潮中&#xff0c;短視頻平臺迅速崛起&#xff0c;成為連接用戶與商家的新橋梁。抖音作為其中的佼佼者&#xff0c;不僅改變了人們的娛樂方式&#xff0c;也催生了新型的電商模式——抖店。許多人好奇&#xff0c;入駐這樣一個充滿活力的平臺&#xff0c;需要承…

618知識狂歡,挑本好書,點亮智慧生活!

618精選編程書單&#xff1a;提升你的代碼力 一年一度的618又到啦&#xff01;今年的618就不要亂買啦&#xff0c;衣服買多了會被淘汰&#xff0c;電子產品買多了會過時&#xff0c;零食買多了會增肥&#xff0c;最后怎么看都不劃算。可是如果你購買知識&#xff0c;堅持閱讀&a…

第N2周:Embeddingbag與Embedding詳解

&#x1f368; 本文為&#x1f517;365天深度學習訓練營 中的學習記錄博客&#x1f356; 原作者&#xff1a;K同學啊 | 接輔導、項目定制&#x1f680; 文章來源&#xff1a;K同學的學習圈子 目錄 什么是詞嵌入&#xff1f; Embedding與EmbeddingBag詳解 Embedding Embeddi…

代碼隨想錄算法訓練營第十七天|LeetCode110 平衡二叉樹、LeetCode257 二叉樹的所有路徑

題1&#xff1a; 指路&#xff1a;LeetCode110 平衡二叉樹 思路與代碼&#xff1a; 左右子樹的高度差小于等于1。對于這個題&#xff0c;遞歸比迭代方便太多&#xff0c;我也想過迭代&#xff0c;但是我沒有寫出來&#xff0c;大家可以自己試一下。遞歸代碼如下&#xff1a;…

如何為ChatGPT編寫有效的提示詞:軟件開發者的指南

作為一名軟件開發者&#xff0c;特別是使用Vue進行開發的開發者&#xff0c;與ChatGPT等AI助手高效互動&#xff0c;可以極大地提升你的開發效率。本文將深入探討如何編寫有效的提示詞&#xff0c;以便從ChatGPT中獲取有用的信息和幫助。 1. 明確目標 在編寫提示詞之前&#…

后端之路第二站(正片)——SprintBoot之:分層解耦

很抽象&#xff0c;我自己也不好理解&#xff0c;僅作為一個前端轉后端的個人理解 一、先解釋一個案例&#xff0c;以這個案例來分析“三層架構” 這里我先解釋一下黑馬程序員里的這個案例&#xff0c;兄弟們看視頻的可以跳過這節課&#xff1a;Day05-08. 請求響應-響應-案例_…

【webrtc】m98:Call的創建及Call對音頻接收處理

call中多個流共享相同的輔助組件 這幾個是與外部共用的 線程傳輸send控制module 線程任務隊列工廠call的輔助組件中各種統計以及接收測的cc是自己創建的 call自己的多個輔助組件是外部傳遞來的 call 創建多個接收流 這里用一個set 來保存所有指針,并沒有要map的意思:

【因果推斷從入門到精通二】隨機實驗3

目錄 檢驗無因果效應假說 硬幣投擲的特殊性何在&#xff1f; 檢驗無因果效應假說 無因果效應假說認為&#xff0c;有些人存活&#xff0c;有些人死亡&#xff0c;但接受mAb114治療而不是ZMapp與此無關。在174例接受mAb14治療的患者中&#xff0c;113/17464.9%存活了28天&…

【MySQL精通之路】InnoDB(6)-磁盤結構

主要博客&#xff1a; 【MySQL精通之路】InnoDB存儲引擎-CSDN博客 1 表 2 索引 【MySQL精通之路】InnoDB(6)-磁盤結構(2)-索引-CSDN博客 3 表空間 【MySQL精通之路】InnoDB(6)-磁盤結構(3)-表空間-CSDN博客 4 雙寫緩沖區 【MySQL精通之路】InnoDB(6)-磁盤結構(4)-雙寫緩沖…

修改MySQL root用戶密碼

ALTER USER ‘root’‘localhost’ IDENTIFIED BY ‘new_password’; ALTER USER ‘root’‘%’ IDENTIFIED BY ‘new_password’; 》 SET GLOBAL read_only OFF; select * from mysql.user;

Java入門基礎學習筆記47——ArrayList

什么是集合呢&#xff1f; 集合是一種容器&#xff0c;用來裝數據的&#xff0c;類似數組。 有數組&#xff0c;為什么還要學習集合呢&#xff1f; 數組定義完成并啟動后&#xff0c;長度就固定了。 而集合是大小可變&#xff0c;開發中用的最多的。 集合的特點&#xff1a;大…

匯聚榮科技有限公司優點有哪些?

在當今快速發展的科技時代&#xff0c;企業之間的競爭愈發激烈。作為一家專注于科技創新與研發的公司&#xff0c;匯聚榮科技有限公司憑借其卓越的技術實力和創新能力&#xff0c;在業界樹立了良好的口碑。那么&#xff0c;匯聚榮科技有限公司究竟有哪些優點呢?接下來&#xf…

C++利用TinyXML讀取XML文件

TinyXML是什么&#xff1f; TinyXML是一個輕量級的C XML解析器&#xff0c;它提供了一種簡單的方法來解析和操作XML文檔。TinyXML被設計為易于使用和集成到C項目中&#xff0c;并且非常適合處理小型XML文件。 以下是TinyXML的一些主要特點和優點&#xff1a; 輕量級: T…

OSPF問題

.ospf 選路 域內 --- 1類&#xff0c;2類LSA 域間 --- 3類LSA 域外 --- 5類&#xff0c;7類LSA --- 根據開銷值的計算規則不同&#xff0c;還分為類型1和類型2 ospf 防環機制 區域內防環&#xff1a;在同一OSPF區域內&#xff0c;所有路由器通過交換鏈路狀態通告&#xff…

VUE面試題(3)--vue常見面試題

1.vue優點 低耦合。視圖(View)可以獨立于Model變化和修改,一個ViewModel可以綁定到不同的"View"上,當View變化的時候Model可以不變,當Model變化的時候View也可以不變。 可重用性。你可以把一些視圖邏輯放在一個ViewModel里面,讓很多view重用這段視圖邏輯。 …

226.翻轉二叉樹

翻轉一棵二叉樹。 思路&#xff1a; 指針做交換 用遞歸&#xff08;前序or后序&#xff0c;中序不行&#xff09; 前序&#xff1a;中左右 遍歷到“中”的時候&#xff0c;交換它的左右孩子 然后分別對它的左孩子和右孩子使用“交換函數”&#xff08;定義的&#xff09;&a…