單調隊列

来源:https://www.cnblogs.com/eason66-blog/archive/2020/02/07/Monotonic_queue.html
-Advertisement-
Play Games

1.單調隊列簡介: 單調隊列是一種數據結構,類似如單調棧,但裡面的元素必須在一個區間內,如果“過時”就要出隊。所以,單調隊列可以在兩端進行出隊,但只能再隊尾入隊。按此性質,傳統的隊列已無法滿足需求,需要使用雙端隊列,再C++的STL里,雙端隊列定義在deque里: #include <deque> ...


1.單調隊列簡介:

單調隊列是一種數據結構,類似如單調棧,但裡面的元素必須在一個區間內,如果“過時”就要出隊。所以,單調隊列可以在兩端進行出隊,但只能再隊尾入隊。按此性質,傳統的隊列已無法滿足需求,需要使用雙端隊列,再C++的STL里,雙端隊列定義在deque里:

#include <deque>

定義:

deque <int> d;

deque的成員函數:

 
函數名 功能描述
push_back 在隊尾插入
push_front 在對頭插入
 pop_back  在隊尾刪除
 pop_front  在隊頭刪除
 empty  判斷是否為空
 front  隊頭元素
 back  隊尾元素

 

進隊時需先判斷是否有元素破壞單調性,如果有則pop_back,再判斷元素是否過時,如果有則pop_front,最後push_back,用代碼表示就是

 1 deque <int> d;//單調隊列
 2 int a[10];//存放讀入的元素
 3 int n;//元素個數
 4 for(int i=0;i<n;i++){
 5 
 6     //假設進隊的是a[i]
 7 
 8     while(!d.empty()&&a[d.back()]<a[i]){//這裡以單調遞增隊列為例,單調遞減隊列可以把小於號改成大於號
 9         d.pop_back();
10     }
11     while(!d.empty()&&d.front<i-4){//假設單調遞增隊列的區間長度為4
12         d.pop_front();
13     }
14     d.push_back(i);
15 }

與單調棧相同,進隊的元素不會再出隊,所以複雜度也是O(n)。

 

 

2.單調隊列的功能:

單調隊列可以查找區間最小(最大)值,與線段樹等複雜度為O(n㏒2n)的演算法相比,單調隊列複雜度為O(n),更加高速。舉個例子,在100,5,30中查找每兩個數中最大值。使用單調遞減隊列,首先100、5入隊(一個元素無法找兩個數中最大值),沒有元素破壞單調性,所以100、5的最大值是隊頭100,然後30入隊,5破壞單調性,出隊;100“過時了”,出隊,所以5、30的最大值就是隊頭30。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • JavaSE學習筆記(4) 抽象類和介面 抽象方法和抽象類 ·抽象方法 使用abstract修飾的方法,沒有方法體,只有聲明。定義的是一種“規範”,就是告訴子類必須要給抽象方法提供具體的實現。 特點 1. 抽象方法必須聲明在抽象類中。 2. 抽象方法聲明引入了一個新方法,但不提供該方法的實現,由於抽 ...
  • Lamda表達式學習筆記二 lamda表達式 方法引用 上一篇講到Lamda體就是對函數式介面方法的實現 ,在方法體中我們可能會引用其他方法實現邏輯,所以在lamda體中我們可以直接引用器方法 I 對象::實例方法名 /** * 對象::實例方法名 */ @Test public void test ...
  • 註意:可變參數類型是在jdk1.5版本的新特性,數組類型是jdk1.0就有了。 這篇文章主要介紹了Java方法的可變參數類型,通過實例對Java中的可變參數類型進行了較為深入的分析,需要的朋友可以參考下。 Java方法中的可變參數類型是一個非常重要的概念,有著非常廣泛的應用。本文就以實例形式對此加以 ...
  • 併發編程之線程第一篇 3.4 原理之線程運行 線程上下文切換(Thread Context Switch) 3.5 常見方法 3.6 start與run 3.7 sleep與yield 案例 - 防止CPU占用100% 3.8 join方法詳解 3.9 interrupt方法詳解 兩階段終止模式 3 ...
  • notepad中運行python cmd /k python "$(FULL_CURRENT_PATH)" & ECHO. & PAUSE & EXIT notepad中運行python kALI 用: sudo apt get install ttf wqy zenhei kali安裝後出現亂碼 ...
  • 在MainModule里 Design 模式 1]RecallLastTheme 設為True 2]Theme選一個皮膚 總共有 classicgraycrispneptunetritontriton.modifiedariagraphite 8個預設皮膚 uses uniStrUtils, pro ...
  • SpringBoot官方不推薦使用jsp,因為jsp不好發揮SpringBoot的特性。官方推薦使用模板引擎代替jsp,現在很多公司都使用FreeMarker來作為SpringBoot的視圖。 SpringBoot對動態頁面的支持很好,為多種模板引擎提供了預設配置,常用的有: Thymeleaf F ...
  • Lamda表達式學習筆記一 一、Lamda語法詮釋 三傻大鬧寶萊塢的主人公蘭徹說的一句話讓我映像深刻:用簡單的語言來表達同樣的意 我並不是說書上的定義怎麼怎麼不對,而是應該理解書本上的定義,並用簡單的話語描述! 那麼正題來了,lamda表達式是什麼? 定義:lamda表達式是一個可傳遞的代碼塊,可以 ...
一周排行
    -Advertisement-
    Play Games
  • 概述:本文代碼示例演示瞭如何在WPF中使用LiveCharts庫創建動態條形圖。通過創建數據模型、ViewModel和在XAML中使用`CartesianChart`控制項,你可以輕鬆實現圖表的數據綁定和動態更新。我將通過清晰的步驟指南包括詳細的中文註釋,幫助你快速理解並應用這一功能。 先上效果: 在 ...
  • openGauss(GaussDB ) openGauss是一款全面友好開放,攜手伙伴共同打造的企業級開源關係型資料庫。openGauss採用木蘭寬鬆許可證v2發行,提供面向多核架構的極致性能、全鏈路的業務、數據安全、基於AI的調優和高效運維的能力。openGauss深度融合華為在資料庫領域多年的研 ...
  • openGauss(GaussDB ) openGauss是一款全面友好開放,攜手伙伴共同打造的企業級開源關係型資料庫。openGauss採用木蘭寬鬆許可證v2發行,提供面向多核架構的極致性能、全鏈路的業務、數據安全、基於AI的調優和高效運維的能力。openGauss深度融合華為在資料庫領域多年的研 ...
  • 概述:本示例演示了在WPF應用程式中實現多語言支持的詳細步驟。通過資源字典和數據綁定,以及使用語言管理器類,應用程式能夠在運行時動態切換語言。這種方法使得多語言支持更加靈活,便於維護,同時提供清晰的代碼結構。 在WPF中實現多語言的一種常見方法是使用資源字典和數據綁定。以下是一個詳細的步驟和示例源代 ...
  • 描述(做一個簡單的記錄): 事件(event)的本質是一個委托;(聲明一個事件: public event TestDelegate eventTest;) 委托(delegate)可以理解為一個符合某種簽名的方法類型;比如:TestDelegate委托的返回數據類型為string,參數為 int和 ...
  • 1、AOT適合場景 Aot適合工具類型的項目使用,優點禁止反編 ,第一次啟動快,業務型項目或者反射多的項目不適合用AOT AOT更新記錄: 實實在在經過實踐的AOT ORM 5.1.4.117 +支持AOT 5.1.4.123 +支持CodeFirst和非同步方法 5.1.4.129-preview1 ...
  • 總說周知,UWP 是運行在沙盒裡面的,所有許可權都有嚴格限制,和沙盒外交互也需要特殊的通道,所以從根本杜絕了 UWP 毒瘤的存在。但是實際上 UWP 只是一個應用模型,本身是沒有什麼許可權管理的,許可權管理全靠 App Container 沙盒控制,如果我們脫離了這個沙盒,UWP 就會放飛自我了。那麼有沒... ...
  • 目錄條款17:讓介面容易被正確使用,不易被誤用(Make interfaces easy to use correctly and hard to use incorrectly)限制類型和值規定能做和不能做的事提供行為一致的介面條款19:設計class猶如設計type(Treat class de ...
  • title: 從零開始:Django項目的創建與配置指南 date: 2024/5/2 18:29:33 updated: 2024/5/2 18:29:33 categories: 後端開發 tags: Django WebDev Python ORM Security Deployment Op ...
  • 1、BOM對象 BOM:Broswer object model,即瀏覽器提供我們開發者在javascript用於操作瀏覽器的對象。 1.1、window對象 視窗方法 // BOM Browser object model 瀏覽器對象模型 // js中最大的一個對象.整個瀏覽器視窗出現的所有東西都 ...