91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

深入淺出了解單調(diào)棧和單調(diào)隊列

Q4MP_gh_c472c21 ? 來源:袁廚的算法小屋 ? 作者:袁廚 ? 2021-02-02 10:18 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

袁廚攜袁記菜館全體工作人員祝大家在新的一年,健健康康,開開心心。發(fā)量暴增,錢包超大。

哎,元旦假期結(jié)束了,又要繼續(xù)搬磚了,我們接著做題吧,今天我們好好說說單調(diào)棧和單調(diào)隊列。其實很容易理解,單調(diào)棧就是棧內(nèi)單調(diào)遞增或單調(diào)遞減的棧,棧內(nèi)元素是有序的,單調(diào)隊列同樣也是。

下面我們通過幾個題目由淺入深,一點一點挖透他們吧!

a5d57fd4-64cf-11eb-8b86-12bb97331649.png

提綱

單調(diào)隊列

劍指 Offer 59 - II. 隊列的最大值

題目描述:

請定義一個隊列并實現(xiàn)函數(shù) max_value 得到隊列里的最大值

若隊列為空,pop_front 和 max_value 需要返回 -1

示例 1:

輸入: ["MaxQueue","push_back","push_back","max_value","pop_front","max_value"]

[[],[1],[2],[],[],[]]

輸出: [null,null,null,2,1,2]

示例 2:

輸入:

["MaxQueue","pop_front","max_value"]

[[],[],[]]

輸出: [null,-1,-1]

題目解析:

我們先來拆解下上面的示例 1

a615481c-64cf-11eb-8b86-12bb97331649.png

其實我覺得這個題目的重點在理解題意上面,可能剛開始刷題的同學(xué),對題意理解不夠透徹,做起來沒有那么得心應(yīng)手,通過上面的圖片我們簡單了解了一下題意,那我們應(yīng)該怎么做才能實現(xiàn)上述要求呢?

下面我們來說一下雙端隊列。我們之前說過的隊列,遵守先進(jìn)先出的規(guī)則,雙端隊列則可以從隊頭出隊,也可以從隊尾出隊,不用遵守先進(jìn)先出的規(guī)則,我們先通過一個視頻來簡單了解下雙端隊列。

我們可以用雙端隊列做輔助隊列,用輔助隊列來保存當(dāng)前隊列的最大值。我們同時定義一個普通隊列和一個雙端單調(diào)隊列。普通隊列就正常執(zhí)行入隊,出隊操作。max_value 操作則返回咱們的雙端隊列的隊頭即可。下面我們來看一下代碼的具體執(zhí)行過程吧。

我們來對視頻進(jìn)行解析

1.我們需要維護(hù)一個單調(diào)雙端隊列,上面的隊列則執(zhí)行正常操作,下面的隊列隊頭元素則為上面隊列的最大值

2.出隊時,我們需要進(jìn)行對比兩個隊列的隊頭元素是否相等,如果相等則同時出隊,則出隊后的雙端隊列的頭部仍為上面隊列中的最大值。

3.入隊時,我們需要維持一個單調(diào)遞減的雙端隊列,因為我們需要確保隊頭元素為最大值嘛。

題目代碼:

a67690cc-64cf-11eb-8b86-12bb97331649.png

239.滑動窗口最大值

題目描述:

給你一個整數(shù)數(shù)組 nums,有一個大小為 k 的滑動窗口從數(shù)組的最左側(cè)移動到數(shù)組的最右側(cè)。你只可以看到在滑動窗口內(nèi)的 k 個數(shù)字?;瑒哟翱诿看沃幌蛴乙苿右晃弧?/p>

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

示例1:

輸入:nums = [1,3,-1,-3,5,3,6,7], k = 3 輸出:[3,3,5,5,6,7]

題目解析:

題目讓我們找出每個滑動窗口的最大值,那么題目具體含義是怎樣呢?

a6c42648-64cf-11eb-8b86-12bb97331649.png

就是為了讓我們輸出每個窗口的最大值,那我們思考一下,我們一個數(shù)組一共有多少窗口呢?

比如我們這個例子中,我們的窗口長度為 3 ,數(shù)組長度為 8,我們的窗口每次移動一位,所以我們一共有 8 - (3 - 1)也就是 8 - 3 + 1。所以我們返回數(shù)組的長度是跟原數(shù)組長度和滑動窗口的長度有關(guān)的。

也就是 winlen = len(數(shù)組長度) - k(滑動窗口長度) + 1。下面我們來看一個視頻,相信通過這個視頻,大家一下就能搞懂啦。

下面我們對視頻進(jìn)行拆解。

1.先將我們第一個窗口的所有值按照規(guī)則存入單調(diào)雙端隊列中,單調(diào)隊列里面的值為單調(diào)遞減的。如果發(fā)現(xiàn)隊尾元素小于要加入的元素,則將隊尾元素出隊,直到隊尾元素大于等于新元素時,再讓新元素入隊,目的就是維護(hù)一個單調(diào)遞減的隊列。第一個窗口的所有值入隊之后情況,如下圖。是因為 3 要入隊時,此時隊中有 1 ,不能保證單調(diào)遞減,所以需要 1 出隊,然后 3 入隊, -1 入隊時,隊中有 3 ,滿足單調(diào),所以 -1 可以入隊。

a706abf8-64cf-11eb-8b86-12bb97331649.png

2.我們將第一個窗口的所有值,按照單調(diào)隊列的規(guī)則入隊之后,因為隊列為單調(diào)遞減,所以隊頭元素必為當(dāng)前窗口的最大值,則將隊頭元素添加到數(shù)組中。

a7587316-64cf-11eb-8b86-12bb97331649.png

3.移動窗口,判斷當(dāng)前窗口前的元素是否和雙端隊列隊頭元素相等,如果相等則出隊,此時滑動窗口的最大值發(fā)生改變了。

a7aca5b2-64cf-11eb-8b86-12bb97331649.png

4.繼續(xù)然后按照規(guī)則進(jìn)行入隊,維護(hù)單調(diào)遞減隊列,這里和第一條規(guī)則一致。

5.每次將隊頭元素存到返回數(shù)組里。

6.返回數(shù)組

是不是一下就搞懂啦。你真帥,下面我們來看一下代碼吧。

題目代碼

a7e28f42-64cf-11eb-8b86-12bb97331649.png

單調(diào)棧

leetcode 155 最小棧

設(shè)計一個支持 push ,pop ,top 操作,并能在常數(shù)時間內(nèi)檢索到最小元素的棧。

push(x) —— 將元素 x 推入棧中。

pop() —— 刪除棧頂?shù)脑亍?/p>

top() —— 獲取棧頂元素。

getMin() —— 檢索棧中的最小元素。

輸入:

["MinStack","push","push","push","getMin","pop","top","getMin"]

[[],[-2],[0],[-3],[],[],[],[]]

輸出:

[null,null,null,null,-3,null,0,-2]

題目解析

感覺這個題目的難度就在讀懂題意上面,讀懂之后就沒有什么難的了,我們在上面的滑動窗口的最大值已經(jīng)進(jìn)行了詳細(xì)描述,其實這個題目和那個題目思路一致。

該題讓我們設(shè)計一個棧,該棧具有的功能有,push,pop,top等操作,并且能夠返回棧的最小值。比如此時棧中的元素為 5,1,2,3。我們執(zhí)行 getMin() ,則能夠返回 1。這塊是這個題目的精髓所在,見下圖, 這個題目也可以不利用輔助棧解決,但是不符合本文主題,所以在這里先不進(jìn)行詳細(xì)描述。大致思路為,把當(dāng)前最小值用一個變量保存,需要入棧的值小于當(dāng)前最小值時,先把當(dāng)前最小值入棧,再將需要入棧的值入棧,并更新當(dāng)前最小值。如果大于當(dāng)前最小值,則直接入棧。getMin()函數(shù)則直接返回變量保存的值即可。下面我們來看一下我們借助輔助棧,如何解決這個題目吧。

a83e070a-64cf-11eb-8b86-12bb97331649.png

我們一起先通過一個視頻先看一下具體解題思路,通過視頻一定可以整懂的,我們注意觀察棧 B 內(nèi)的元素。

我們來對視頻進(jìn)行解析

1.我們執(zhí)行入棧操作時,先觀察需要入棧的元素是否小于棧 B 的棧頂元素,如果小于則兩個棧都執(zhí)行入棧操作。

2.棧 B 的棧頂元素則是棧 A 此時的最小值。則 getMin() 只需返回棧 B 的棧頂元素即可。

3.出棧時,需要進(jìn)行對比,若棧 A 和棧 B 棧頂元素相同,則同時出棧,出棧后B 的棧頂保存的仍為此時棧 A 的最小元素

題目代碼

a877d566-64cf-11eb-8b86-12bb97331649.png

leetcode 739 每日溫度

題目描述:

請根據(jù)每日 氣溫 列表,重新生成一個列表。對應(yīng)位置的輸出為:要想觀測到更高的氣溫,至少需要等待的天數(shù)。如果氣溫在這之后都不會升高,請在該位置用 0 來代替。

示例1:

輸入:temperatures = [73, 74, 75, 71, 69, 72, 76, 73]

輸出:arr = [1, 1, 4, 2, 1, 1, 0, 0]

示例2:

輸入:temperatures = [30,30,31,45,31,34,56]

輸出:arr = [2,1,1,3,1,1,0]

題目解析

其實我們可以換種方式理解這個題目,比如我們 temperatures[0] = 30,則我們需要找到后面第一個比 30 大的數(shù),也就是 31,31的下標(biāo)為 2,30 的下標(biāo)為 0 ,則我們的返回數(shù)組 arr[0] = 2。理解了題目之后我們來說一下解題思路。

遍歷數(shù)組,數(shù)組中的值為待入棧元素,待入棧元素入棧時會先跟棧頂元素進(jìn)行對比,如果小于等于該值則入棧,如果大于則將棧頂元素出棧,新的元素入棧。

例如棧頂為69,新的元素為72,則69出棧,72入棧。并賦值給 arr,69 的索引為4,72的索引為5,則 arr[4] = 5 - 4 = 1,這個題目用到的是單調(diào)棧的思想,下面我們來看一下視頻解析。

注:棧中的括號內(nèi)的值,代表索引對應(yīng)的元素,我們的入棧的為索引值,為了便于理解將其對應(yīng)的值寫在了括號中

a8c1a42a-64cf-11eb-8b86-12bb97331649.png

leetcode 42 接雨水

這道接雨水也是一道特別經(jīng)典的題目,一道必刷題目,我們也用單調(diào)棧來解決。下面我們來看一下題目吧

題目描述:

給定 n 個非負(fù)整數(shù)表示每個寬度為 1 的柱子的高度圖,計算按此排列的柱子,下雨之后能接多少雨水。

示例1:

輸入:height =[0,1,0,2,1,0,1,3,2,1,2,1]

輸出:6

示例2:

輸入:height =[4,2,0,3,2,5]

輸出:9

示例2:

輸入:[4,3,2,0,1,1,5

輸出:13

題目解析:

看了上面的示例剛開始刷題的同學(xué)可能有些懵逼,那我們結(jié)合圖片來理解一下,我們就用示例3的例子進(jìn)行舉例,他的雨水到底代表的是什么。輸入代表的是黃色箱子的個數(shù),藍(lán)色箱子代表雨水?dāng)?shù)量??p隙之間可以裝多少水

a90fa828-64cf-11eb-8b86-12bb97331649.png

說明:上面是由數(shù)組 [4,3,2,0,1,1,5]表示的高度圖,在這種情況下,可以接 13個單位的雨水(見下圖)。

上圖則為我們的題目描述,是不是理解了呢?你也可以這樣理解我們在地上放置了若干高度的黃色箱子,他們中間有空隙,然后我們想在他們里面插入若干藍(lán)色箱子,并保證插入之后,這些箱子的左視圖和右視圖都不能看到藍(lán)色箱子。 好啦題目我們已經(jīng)理解了,下面我們來看一下接雨水問題到底該怎么做,其實原理也很簡單,我們通過我們的例3來進(jìn)行說明。 首先我們依次入棧4,3,2,0我們的數(shù)組前四個元素是符合單調(diào)棧規(guī)則的。但是我們的第五個1,是大于0的。那我們就需要0出棧1入棧。但是我們這樣做是為了什么呢?有什么意義呢?別急我們來看下圖。

a9500dfa-64cf-11eb-8b86-12bb97331649.png

上圖我們的,4,3,2,0已經(jīng)入棧了,我們的另一個元素為1,棧頂元素為0,棧頂下的元素為2。那么我們在這一層接到的雨水?dāng)?shù)量怎么算呢?2,0,1這三個元素可以接住的水為一個單位(見下圖)這是我們第一層接到水的數(shù)量。 注:能接到水的情況,肯定是中間低兩邊高的情況

a9a1d252-64cf-11eb-8b86-12bb97331649.png

因為我們需要維護(hù)一個單調(diào)棧,所以我們則需要將0出棧1入棧,那么此時棧內(nèi)元素為4,3,2,1。下一位元素為1,我們?nèi)霔?,此時棧內(nèi)元素為4,3,2,1,1。 下一元素為5,棧頂元素為1,棧頂?shù)南乱辉厝詾?,則需要再下一個元素,為2,那我們求當(dāng)前層接到的水的數(shù)量。 注:棧內(nèi)保存的應(yīng)是索引值,這里為了便于理解用了value值

a9f9ee38-64cf-11eb-8b86-12bb97331649.png

我們是通過2,1,1,5這四個元素求得第二層的接水?dāng)?shù)為1*3=3;1是因為min(2-1,5-1)=min(1,4)得來的,大家可以思考一下木桶效應(yīng)。裝水的多少,肯定是按最短的那個木板來的,所以高度為1,3的話是因為5的索引為6,2的索引為2,他們之間共有三個元素(3,4,5)也就是3個單位。所以為6-2-1=3。 將1出棧之后,我們棧頂元素就變成了2,下一元素變成了3,那么3,2,5這三個元素同樣也可以接到水。

aa566686-64cf-11eb-8b86-12bb97331649.png

這是第三層的接水情況,能夠接到4個單位的水,下面我們繼續(xù)出棧2,那么我們的4,3,5仍然可以接到水啊。

aad0ff86-64cf-11eb-8b86-12bb97331649.png

這是我們第四層接水的情況,一共能夠接到5個單位的水,那么我們總的接水?dāng)?shù)加起來,那就是1+3+4+5=13。你學(xué)會了嗎?別急還有動圖我們,我們再來深入理解一哈。

題目代碼:

ab34aed2-64cf-11eb-8b86-12bb97331649.png

好啦,咱們的單調(diào)隊列和單調(diào)棧的題目到這里就算總結(jié)完畢啦,希望對你能有一點點幫助。

原文標(biāo)題:深入淺出搞通單調(diào)隊列單調(diào)棧

文章出處:【微信公眾號:嵌入式ARM】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

責(zé)任編輯:haq

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴

原文標(biāo)題:深入淺出搞通單調(diào)隊列單調(diào)棧

文章出處:【微信號:gh_c472c2199c88,微信公眾號:嵌入式微處理器】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點推薦

    RDMA設(shè)計26:隊列管理模塊設(shè)計之接收隊列模塊詳細(xì)分析

    管理單元并不需要占用存儲資源,可以更好的節(jié)省系統(tǒng)的資源占用并提高接收隊列處理效率。 B站已給出相關(guān)性能的視頻,如想進(jìn)一步了解,請搜索B站用戶:專注與守望 https://www.bilibili.com
    發(fā)表于 01-22 09:03

    RDMA設(shè)計24:隊列管理模塊設(shè)計

    隊列管理模塊采用管理與存儲分離的結(jié)構(gòu)進(jìn)行設(shè)計,由發(fā)送隊列存儲、發(fā)送隊列管理、接收隊列管理、完成條目解析、異常完成條目處理和 Round-Robin 仲裁組成。
    的頭像 發(fā)表于 01-20 11:45 ?1337次閱讀
    RDMA設(shè)計24:<b class='flag-5'>隊列</b>管理模塊設(shè)計

    深入淺出:SN65LVDSxxx高速差分線驅(qū)動與接收器解析

    深入淺出:SN65LVDSxxx高速差分線驅(qū)動與接收器解析 在高速數(shù)據(jù)傳輸?shù)念I(lǐng)域中,低電壓差分信號(LVDS)技術(shù)以其低功耗、高速度和抗干擾能力強(qiáng)等優(yōu)勢,成為了眾多電子工程師的首選。德州儀器(TI
    的頭像 發(fā)表于 01-15 15:30 ?215次閱讀

    RDMA設(shè)計17:隊列管理模塊設(shè)計2

    接收模塊通知 DMA 控制器處理數(shù)據(jù)。這樣的設(shè)計使得接收隊列管理單元并不需要占用存儲資源,可以更好的節(jié)省系統(tǒng)的資源占用并提高接收隊列處理效率。 B站已給出相關(guān)性能的視頻,如想進(jìn)一步了解,請搜索B站用戶
    發(fā)表于 01-04 14:54

    RDMA設(shè)計12:融合以太網(wǎng)協(xié)議設(shè)計1

    RDMA 隊列并實現(xiàn) RDMA 指令提交與完成機(jī)制。在 RoCE v2 高速數(shù)據(jù)傳輸系統(tǒng)中,用戶通過配置系統(tǒng)控制模塊中的寄存器或寄存器組來實現(xiàn)隊列管理和數(shù)據(jù) DMA 請求。融合以太網(wǎng)協(xié)議在獲取相關(guān)指令
    發(fā)表于 12-25 11:39

    DAC11001A 20位單調(diào)DAC技術(shù)手冊

    20位DAC11001A、18位DAC91001和16位DAC81001(DACx1001)是高精度、低噪聲、電壓輸出、單通道、數(shù)模轉(zhuǎn)換器(DAC)。DACx1001 采用單調(diào)設(shè)計,在所有范圍內(nèi)均
    的頭像 發(fā)表于 11-04 09:45 ?506次閱讀
    DAC11001A 20位<b class='flag-5'>單調(diào)</b>DAC技術(shù)手冊

    DAC91001 18位單調(diào)DAC技術(shù)手冊

    指定為單調(diào),并在所有范圍內(nèi)提供小于 4 LSB(最大值)的出色線性度。 無緩沖電壓輸出提供低噪聲性能 (7 nV/√Hz) 和快速建立時間 (1μs),使該器件成為低噪聲、快速控制環(huán)路和波形生成
    的頭像 發(fā)表于 11-03 10:40 ?706次閱讀
    DAC91001 18位<b class='flag-5'>單調(diào)</b>DAC技術(shù)手冊

    DAC81001 16 位單調(diào) DAC技術(shù)手冊

    指定為單調(diào),并在所有范圍內(nèi)提供小于 4 LSB(最大值)的出色線性度。 無緩沖電壓輸出提供低噪聲性能 (7 nV/√Hz) 和快速建立時間 (1μs),使該器件成為低噪聲、快速控制環(huán)路和波形生成
    的頭像 發(fā)表于 11-03 10:34 ?524次閱讀
    DAC81001 16 位<b class='flag-5'>單調(diào)</b> DAC技術(shù)手冊

    DAC11001B 高級、20位、單調(diào)DAC技術(shù)手冊

    20位DAC11001B是一款高精度、低噪聲、電壓輸出、單通道、數(shù)模轉(zhuǎn)換器(DAC)。該DAC11001B設(shè)計為單調(diào),并在所有輸出范圍內(nèi)提供出色的線性度。 無緩沖電壓輸出提供低噪聲性能 (7
    的頭像 發(fā)表于 10-31 09:47 ?590次閱讀
    DAC11001B 高級、20位、<b class='flag-5'>單調(diào)</b>DAC技術(shù)手冊

    基于環(huán)形隊列的UART收發(fā)回顯實驗

    在實際項目開發(fā)中,由于有些串口不具備FIFO(如SCI1和SCI2)或FIFO的buffer比較小,這可能會在數(shù)據(jù)處理速度小于數(shù)據(jù)接收速度的時候,導(dǎo)致數(shù)據(jù)的丟失。因此我們可以設(shè)計一個隊列來避免這一
    的頭像 發(fā)表于 10-27 13:51 ?1971次閱讀
    基于環(huán)形<b class='flag-5'>隊列</b>的UART收發(fā)回顯實驗

    程序設(shè)計與數(shù)據(jù)結(jié)構(gòu)

    的地址)出發(fā),采用推導(dǎo)的方式,深入淺出的分析了廣大C程序員學(xué)習(xí)和開發(fā)中遇到的難點。 2. 從方法論的高度對C語言在數(shù)據(jù)結(jié)構(gòu)和算法方面的應(yīng)用進(jìn)行了深入講解和闡述。 3. 講解了絕大多數(shù)C程序員開發(fā)
    發(fā)表于 05-13 16:45

    NVME控制器之隊列管理模塊

    如圖1所示。 圖1 隊列管理模塊框圖 在NVMe協(xié)議中,使用隊列來傳輸、緩存和處理命令條目,以實現(xiàn)Host端和NVMe SSD端之間的通信。在CPU上運行NVMe軟件協(xié)議,其Host端生成提交命令
    發(fā)表于 05-03 20:19

    NVME控制器之隊列管理模塊

    隊列管理模塊是整個NVMe Host控制器的核心模塊,該模塊實現(xiàn)了提交隊列與完成隊列的管理,多隊列請求的仲裁判決等功能。隊列管理模塊中含有數(shù)
    的頭像 發(fā)表于 05-03 15:32 ?648次閱讀
    NVME控制器之<b class='flag-5'>隊列</b>管理模塊

    深入淺出解析低功耗藍(lán)牙協(xié)議

    深入Bluetooth LE協(xié)議各個組成部分之前,我們先看一下Bluetooth LE協(xié)議整體架構(gòu)。 如上圖所述,要實現(xiàn)一個Bluetooth LE應(yīng)用,首先需要一個支持Bluetooth
    的頭像 發(fā)表于 04-09 14:49 ?1280次閱讀
    <b class='flag-5'>深入淺出</b>解析低功耗藍(lán)牙協(xié)議<b class='flag-5'>棧</b>

    《零基礎(chǔ)開發(fā)AI Agent——手把手教你用扣子做智能體》

    《零基礎(chǔ)開發(fā)AI Agent——手把手教你用扣子做智能體》是一本為普通人量身打造的AI開發(fā)指南。它不僅深入淺出地講解了Agent的概念和發(fā)展,還通過詳細(xì)的工具介紹和實戰(zhàn)案例,幫助讀者快速掌握
    發(fā)表于 03-18 12:03