日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

數組結構~什么是單調棧

來源: 責編: 時間:2023-08-09 23:02:09 436觀看
導讀什么是棧要弄明白什么是棧,我們需要先舉一個生活中的例子。假如有一個又細又長的圓筒,圓筒一端封閉,另一端開口。往圓筒里放 入乒乓球,先放入的靠近圓筒底部,后放入的靠近圓筒入口。那么,要想取出這些乒乓球,則只能按照和放

什么是棧

要弄明白什么是棧,我們需要先舉一個生活中的例子。JjI28資訊網——每日最新資訊28at.com

假如有一個又細又長的圓筒,圓筒一端封閉,另一端開口。往圓筒里放 入乒乓球,先放入的靠近圓筒底部,后放入的靠近圓筒入口。JjI28資訊網——每日最新資訊28at.com

JjI28資訊網——每日最新資訊28at.com

那么,要想取出這些乒乓球,則只能按照和放入順序相反的順序來取,先取出后放入的,再取出先放入的,而不可能把最里面最先放入的乒乓球優先取出。JjI28資訊網——每日最新資訊28at.com

棧(stack)是一種線性數據結構,它就像一個上圖所示的放入乒乓球的 圓筒容器,棧中的元素只能先入后出 (First In Last Out,簡稱FILO )。最早進入的元素存放的位置叫作棧底 (bottom),最后進入的元素 存放的位置叫作棧頂 (top)。JjI28資訊網——每日最新資訊28at.com

棧這種數據結構既可以用數組來實現,也可以用鏈表來實現。JjI28資訊網——每日最新資訊28at.com

棧的數組實現如下。JjI28資訊網——每日最新資訊28at.com

JjI28資訊網——每日最新資訊28at.com

棧的鏈表實現如下。JjI28資訊網——每日最新資訊28at.com

JjI28資訊網——每日最新資訊28at.com

那么,棧可以進行哪些操作呢?棧的最基本操作是入棧和出棧,下面讓我們來看一看。JjI28資訊網——每日最新資訊28at.com

棧的基本操作

入棧

入棧操作(push)就是把新元素放入棧中,只允許從棧頂一側放入元素,新元素的位置將會成為新的棧頂。JjI28資訊網——每日最新資訊28at.com

這里我們以數組實現為例。JjI28資訊網——每日最新資訊28at.com

JjI28資訊網——每日最新資訊28at.com

出棧

出棧操作(pop)就是把元素從棧中彈出,只有棧頂元素才允許出棧,出棧元素的前一個元素將會成為新的棧頂。JjI28資訊網——每日最新資訊28at.com

這里我們以數組實現為例。JjI28資訊網——每日最新資訊28at.com

JjI28資訊網——每日最新資訊28at.com

入棧和出棧操作,時間復雜度分別是多少?JjI28資訊網——每日最新資訊28at.com

入棧和出棧只會影響到最后一個元素,不涉及其他元素的整體移動,所以無論是以數組還是以鏈表實JjI28資訊網——每日最新資訊28at.com

現,入棧、出棧的時間復雜度都是O(1) 。JjI28資訊網——每日最新資訊28at.com

什么是單調棧

單調遞增棧 從棧底到棧頂的元素關鍵字的大小單調遞增;JjI28資訊網——每日最新資訊28at.com

單調遞減棧 從棧底到棧頂的元素關鍵字的大小單調遞減;JjI28資訊網——每日最新資訊28at.com

適用問題:JjI28資訊網——每日最新資訊28at.com

要知道單調棧的適用于解決什么樣的問題,我們首先需要知道單調棧的作用。單調棧分為單調遞增棧和單調遞減棧,通過使用單調棧我們可以訪問到下一個比他大(小)的元素(或者說可以)。JjI28資訊網——每日最新資訊28at.com

也就是說在隊列或數組中,我們需要通過比較前后元素的大小關系來解決問題時我們通常使用單調棧。JjI28資訊網——每日最新資訊28at.com


JjI28資訊網——每日最新資訊28at.com

舉個栗子

有一個地方要傳授武林秘籍,大家要在這一天之前來這里排好隊等著學習武林秘籍。來了很多武林高手,但是這個地方的人要根據人來的先后順序教,先來的學的武功就高深,來的越靠后學的就越差,但是能保證只要來就能學到。假如他們一開始有一個初始的排隊順序和武力水平如下所示,大家可以按照這個初始順序從前往后學習。JjI28資訊網——每日最新資訊28at.com

JjI28資訊網——每日最新資訊28at.com

問題來了,武力值高的肯定愿意先學習到高深一點的武功啊,那我就找到前面武力值低的人說:“你別學了,我教你一門武功,然后離開,否則就咔嚓了你??”,武力值低的那聽就答應了也就只能無可奈何的打印了,從后來的那個人那里哪里學了一門武術就離開了,這樣武功高的那個就排在了前面。下面我們來從前往后模擬一下過程:JjI28資訊網——每日最新資訊28at.com

(1)首先來的是炮灰甲,炮灰甲一看,OK,棧內沒有人就可以先排在第一位JjI28資訊網——每日最新資訊28at.com

(2)然后掃地僧來了,掃地僧教給了炮灰甲一招易筋經,然后掃地僧讓炮灰甲離開自己排在第一位。JjI28資訊網——每日最新資訊28at.com

(3)然后楊過過來,看到前面是掃地僧,自己打不過只能老老實實站到隊里。JjI28資訊網——每日最新資訊28at.com

(4)后面一直來人(如3)------ 直到張三 對里面站的是 掃地僧 楊過 慕容復 張三 。JjI28資訊網——每日最新資訊28at.com

(5)然后張無忌來了,他首先看到前面是張三,張無忌教給張三一招武當梯云縱,然后讓張三離開了,張無忌再往前看到了慕容復教他一招太極拳,然后繼續直到遇到掃地僧,OK,自己打不過,老老實實的占到了后面 —現在隊里有掃地僧,張無忌 ----楊過,慕容復,張三的師傅為張無忌JjI28資訊網——每日最新資訊28at.com

(6)柯鎮惡來了,打不過,站到后面就好了。JjI28資訊網——每日最新資訊28at.com

(7)然后喬峰來了把柯鎮惡和張無忌打發走, —現在隊里有掃地僧,喬峰。JjI28資訊網——每日最新資訊28at.com

(8)然后李四來了,打不過喬峰,只能站到了最后。JjI28資訊網——每日最新資訊28at.com

(9)第二天掃地僧,喬峰,李四成功學到了武林秘籍JjI28資訊網——每日最新資訊28at.com

現在看他們分別學到武功對應如下圖:JjI28資訊網——每日最新資訊28at.com

JjI28資訊網——每日最新資訊28at.com

這樣我們就處理完了所有過程。因此單調棧的時間復雜度為O(n),在比較時對出棧的元素有一個處理(例如掃地僧讓炮灰甲走的時候教給他自己的武功),另外最后留在站內的元素有一個統一的處理(掃地僧,喬峰,李四成功學到了武林秘籍)。JjI28資訊網——每日最新資訊28at.com

偽代碼如下所示:JjI28資訊網——每日最新資訊28at.com

對于第i個到來的人:JjI28資訊網——每日最新資訊28at.com

  • 每當隊里面有人并且打不過自己的時候:
  • 讓這個人離開并交給他自己的武功
  • 自己入隊

LCR 039. 柱狀圖中最大的矩形

JjI28資訊網——每日最新資訊28at.com

思路:有了單調棧的基本認識,我們可以遍歷每根柱子,以當前柱子 i 的高度作為矩形的高,那么矩形的寬度邊界即為向左找到第一個高度小于當前柱體 i 的柱體,向右找到第一個高度小于當前柱體 i 的柱體。對于每個柱子我們都如上計算一遍以當前柱子作為高的矩形面積,最終比較出最大的矩形面積即可。JjI28資訊網——每日最新資訊28at.com

單調棧實現:尋找兩邊距離arr[i]最近且arr[i]小的索引,保持棧頂到棧底單調遞減,棧中存放索引值。JjI28資訊網——每日最新資訊28at.com

注意:頭0如果不添加,尋找左邊元素需要判斷棧是否為空;尾0如果不添加,需要重新寫一個循環彈出棧內元素。JjI28資訊網——每日最新資訊28at.com

class Solution {    public int largestRectangleArea(int[] heights) {        int n = heights.length;        int [] left = new int[n];        int [] right = new int[n];        Stack<Integer> stack = new Stack<>();        for(int i = 0; i < n; i++){            while (!stack.isEmpty() && heights[i] <= heights[stack.peek()]){                stack.pop();            }            left[i] = (stack.isEmpty() ? -1: stack.peek());            stack.push(i);        }        stack.clear();        for(int i = n-1; i >= 0; i--){            while (!stack.isEmpty() && heights[i] <= heights[stack.peek()]){                stack.pop();            }            right[i] = (stack.isEmpty() ? n : stack.peek());            stack.push(i);        }        int res = 0;        for(int i = 0; i < n; i++){            res = Math.max(res, (right[i] - left[i] - 1) * heights[i]);        }        return res;    }}

42.接雨水

該題目有多種解法,本次只介紹單調棧的方式,對其它算法感興趣的朋友可以自己去嘗試一下~~JjI28資訊網——每日最新資訊28at.com

思路:理解題目注意題目的性質,當后面的柱子高度比前面的低時,是無法接雨水的,當找到一根比前面高的柱子,就可以計算接到的雨水。所以使用單調遞減棧:JjI28資訊網——每日最新資訊28at.com

  • 對更低的柱子入棧,更低的柱子以為這后面如果能找到高柱子(可以理解為 代碼中的 left ),這里就能接到雨水,所以入棧把它保存起來。
  • 當出現高于棧頂(代碼中 top)的柱子時說明可以對前面的柱子結算了
class Solution {    public int trap(int[] height) {        int ans = 0;        Stack<Integer> stack = new Stack<Integer>();        int n = height.length;        for (int i = 0; i < n; ++i) {            while (!stack.isEmpty() && height[i] > height[stack.peek()]) {                int top = stack.pop();                if (stack.isEmpty()) {                    break;                }                int left = stack.peek();                int currWidth = i - left - 1;                int currHeight = Math.min(height[left], height[i]) - height[top];                ans += currWidth * currHeight;            }            stack.push(i);        }        return ans;    }}


JjI28資訊網——每日最新資訊28at.com

本文鏈接:http://m.www897cc.com/showinfo-26-5102-0.html數組結構~什么是單調棧

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 如何優雅地處理RabbitMQ中的消息丟失

下一篇: 聊聊如何理解流量分發

標簽:
  • 熱門焦點
Top 日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不
国产精品无人区| 亚洲永久视频| 在线观看欧美日韩国产| 狠狠色综合网站久久久久久久| 国产一区二区三区丝袜 | 久久精品国产免费| 久久夜色撩人精品| 欧美大片网址| 欧美精品在线免费播放| 欧美视频精品在线| 国产九九精品视频| 一区二区三区在线视频观看| 在线精品在线| 日韩午夜精品视频| 亚洲图片在线| 久久精品国产视频| 久久天天躁狠狠躁夜夜av| 免费观看一级特黄欧美大片| 欧美日本一道本在线视频| 国产精品国产三级国产a| 国产视频精品xxxx| 亚洲高清在线观看| 亚洲调教视频在线观看| 亚洲欧美在线视频观看| 久久亚洲精品中文字幕冲田杏梨| 欧美精品一卡| 欧美亚洲不卡| 黄色日韩在线| 99这里只有精品| 欧美一激情一区二区三区| 免费成人av| 欧美性大战xxxxx久久久| 国产一区二区精品久久99| 亚洲黄色毛片| 性xx色xx综合久久久xx| 欧美成年网站| 国产精品五区| 亚洲日本va午夜在线影院| 亚洲欧美日韩天堂一区二区| 蜜桃久久精品一区二区| 国产精品久久久久久久久婷婷| 韩国v欧美v日本v亚洲v| 日韩午夜激情av| 久久精品日韩| 欧美日韩亚洲精品内裤| 国内自拍亚洲| 亚洲午夜av| 欧美承认网站| 国产一二三精品| 99re在线精品| 老司机精品导航| 国产精品一区一区| 亚洲久久在线| 久久精品在线视频| 国产精品久久久久9999| 亚洲国产成人午夜在线一区| 欧美一级视频免费在线观看| 欧美激情四色 | 国产日韩欧美一区在线| 99国产精品久久久久久久| 久久精品夜色噜噜亚洲aⅴ| 欧美图区在线视频| 亚洲精品视频免费| 久久在线免费| 国产午夜精品久久久久久久| 在线视频精品一| 欧美韩日亚洲| 国产在线精品二区| 午夜精品成人在线| 欧美三级韩国三级日本三斤| 亚洲激情在线播放| 久久先锋资源| 国产一区二区在线免费观看| 亚洲一区二区欧美日韩| 欧美人在线观看| 91久久极品少妇xxxxⅹ软件| 久久久久成人精品| 国产亚洲福利社区一区| 午夜精品视频在线观看| 国产精品激情| 在线视频欧美一区| 欧美日韩国产探花| 亚洲国产导航| 麻豆精品在线播放| 伊人伊人伊人久久| 欧美一区=区| 国产精品综合久久久| 亚洲一区二区在线免费观看| 欧美三区在线视频| 一区二区欧美日韩| 欧美日韩视频不卡| 一区二区欧美激情| 欧美日韩国产免费观看| 99re成人精品视频| 欧美日韩精品在线观看| 亚洲日本国产| 欧美日本视频在线| 99亚洲一区二区| 欧美日韩免费高清一区色橹橹| 亚洲美女精品久久| 欧美日韩国产天堂| 亚洲午夜精品网| 国产精品久久久一区二区三区| 亚洲男人天堂2024| 国产精品免费网站在线观看| 亚洲一区中文| 国产美女扒开尿口久久久| 欧美一区二区三区视频在线| 国产日韩欧美夫妻视频在线观看| 欧美一区二区三区另类| 国产亚洲精品高潮| 久久疯狂做爰流白浆xx| 激情综合网址| 欧美不卡在线视频| 亚洲免费黄色| 国产精品大全| 性欧美8khd高清极品| 国语自产精品视频在线看抢先版结局| 久久久www免费人成黑人精品| 一区二区自拍| 欧美精品免费在线| 亚洲理伦电影| 欧美日韩一区二| 9国产精品视频| 欧美理论电影在线观看| 一区二区日韩免费看| 国产精品一区二区在线观看网站| 欧美一级片在线播放| 国产亚洲成年网址在线观看| 开心色5月久久精品| 亚洲六月丁香色婷婷综合久久| 欧美视频在线一区二区三区| 欧美一区二区福利在线| 在线观看欧美日本| 欧美日韩精品二区第二页| 亚洲免费人成在线视频观看| 国模精品一区二区三区| 欧美成人免费在线| 亚洲先锋成人| 精品999久久久| 欧美日韩国产不卡在线看| 99成人在线| 国产亚洲成av人片在线观看桃| 欧美在线视频a| 一区二区三区在线视频观看| 榴莲视频成人在线观看| 一区二区动漫| 国产自产高清不卡| 欧美精品激情blacked18| 亚洲最新视频在线播放| 欧美午夜片在线观看| 欧美亚洲一区在线| 国内一区二区三区在线视频| 欧美片在线观看| 久久精品道一区二区三区| 亚洲人www| 国产欧美一区二区精品婷婷| 欧美成人激情视频| 亚洲欧美日韩高清| 亚洲激情在线观看视频免费| 欧美日韩一区精品| 久久精品首页| av成人激情| 在线免费观看欧美| 国产精品女主播一区二区三区| 母乳一区在线观看| 欧美一区视频| 宅男噜噜噜66一区二区| 在线日韩一区二区| 国产欧美精品一区二区三区介绍| 欧美激情国产日韩| 久久久噜噜噜久久人人看| 亚洲午夜女主播在线直播| 91久久亚洲| 国内成人在线| 国产精品视频九色porn| 欧美激情国产日韩| 久久久久一区二区三区四区| 亚洲欧美日韩国产中文| 亚洲免费av网站| 亚洲福利在线视频| 国语自产精品视频在线看一大j8 | 亚洲综合色视频| 亚洲免费久久| 亚洲二区视频在线| 国产日韩欧美制服另类| 欧美午夜精品| 欧美激情精品久久久六区热门| 久久久.com| 性做久久久久久久久| 一区二区三区国产盗摄| 亚洲日本成人在线观看| 在线观看欧美亚洲| 国产综合在线视频| 欧美国产日韩一二三区| 99国产精品私拍| 国内精品久久国产| 国产欧美一区二区精品忘忧草| 欧美午夜精品| 欧美人妖另类| 欧美极品在线视频| 欧美~级网站不卡| 久久中文精品| 久久久久久自在自线|