開學第十一周 two(資料結構)

2021-09-22 08:22:00 字數 2962 閱讀 3900

今天是週六呀!是省賽呵,我突然後悔了,我有點痛恨那個因為怕自己菜拿不到名次的我,唉,如果連上場的勇氣都沒有又怎麼敢奢求成功呢?勇於嘗試!

這幾天太安逸了,基本沒有刷題,別人都衝上戰場了,你還在貪圖享樂,那不該是你,也不能是你,kbb。別忘了你的短處,你說好的付出比別人更多呢?說好的人一我十,人十我萬呢?別讓自己都瞧不起自己啊!

今天下午班級競選入黨積極分子,我票數最高,有點驚訝,感謝為我投票的室友以及不知名的兩個女生,本來這學期想混過去的,看來這想法不能有了啊,積極複習吧。別讓支援你的人失望哈。

單調棧有以下兩個性質:

1、若是單調遞增棧,則從棧頂到棧底的元素是嚴格遞增的。若是單調遞減棧,則從棧頂到棧底的元素是嚴格遞減的。

2、越靠近棧頂的元素越後進棧。

單調棧與單調佇列不同的地方在於棧只能在棧頂操作,因此一般在應用單調棧的地方不限定棧的大小,否則可能會造成元素無法進棧。

元素進棧過程:對於單調遞增棧,若當前進棧元素為e,從棧頂開始遍歷元素,把小於e或者等於e的元素彈出棧,直接遇到乙個大於e的元素或者棧為空為止,然後再把e壓入棧中。對於單調遞減棧,則每次彈出的是大於e或者等於e的元素。

問題描述

地上從左到右豎立著 n 塊木板,從 1 到 n 依次編號,如下圖所示。我們知道每塊木板的高度,在第 n 塊木板右側豎立著一塊高度無限大的木板,現對每塊木板依次做如下的操作:對於第 i 塊木板,我們從其右側開始倒水,直到水的高度等於第 i 塊木板的高度,倒入的水會淹沒 ai 塊木板(如果木板左右兩側水的高度大於等於木板高度即視為木板被淹沒),求 n 次操作後,所有 ai 的和是多少。如圖上所示,在第 4 塊木板右側倒水,可以淹沒第 5 塊和第 6 塊一共 2 塊木板,a4 = 2。

暴力求解,複雜度是o(n²)

例如現在存在5塊木板

每塊木板從左至右高分別為

10,5,8,12,6

從第一塊木板(高度為10)右側開始倒水,當水到達第四塊木板(高度為12)時,可以淹沒第一塊木板

即第一塊木板至第四塊木板之間的木板數量,即4-1-1 = 2,a1 = 2;

也就是說:尋找在第 i 個木板右邊第乙個比它大的木板j,ai 就等於木板 i 和木板 j 之間的木板數

同理得到

a2=0

a3=0

a4=1

a5=0

sum = a1 + a2 +a3 +a4 +a5 = 3

於是,問題就變成了尋找在第 i 個數右邊第乙個比它大的數。可以暴力求解,從 1 迴圈到 n,對每塊木板再往右迴圈一遍,這樣的時間複雜度是o(n²)o(n²) 。

單調棧來求解的話,複雜度是o(n)

結合單調棧的性質:使用單調棧可以找到元素向左遍歷第乙個比他小的元素,也可以找到元素向左遍歷第乙個比他大的元素。

顧名思義,單調棧就是棧內元素單調遞增或者單調遞減的棧,這一點和單調佇列很相似,但是單調棧只能在棧頂操作。

單調棧有以下兩個性質:

1、若是單調遞增棧,則從棧頂到棧底的元素是嚴格遞增的。若是單調遞減棧,則從棧頂到棧底的元素是嚴格遞減的。

2、越靠近棧頂的元素越後進棧。

單調棧與單調佇列不同的地方在於棧只能在棧頂操作,因此一般在應用單調棧的地方不限定棧的大小,否則可能會造成元素無法進棧。

元素進棧過程:對於單調遞增棧,若當前進棧元素為e,從棧頂開始遍歷元素,把小於e或者等於e的元素彈出棧,直接遇到乙個大於e的元素或者棧為空為止,然後再把e壓入棧中。對於單調遞減棧,則每次彈出的是大於e或者等於e的元素。

資料模擬木板倒水單調棧的入棧計算過程

思路:尋找比棧頂高的木板i,找到就出棧,不是就把木板i入棧,給出迴圈計數樣例 10,5,8,12,6

從左往右掃瞄

棧為空,10入棧 棧:10 此時棧頂是10,也就是說要尋找比10大的木板

5比10小,5入棧 棧:5,10 此時棧頂是5,也就是說要尋找比5大的木板

8比5大,5出棧 棧:10

這個時候,第二個高度為5的木板右邊比它高的木板已經找到了,是第三個木板8,所以5出棧,計算a2 = 3-2-1 = 0

8比10小,8入棧 棧:8,10 此時棧頂是8,也就是說要尋找比8大的木板

12比8大,8出棧 棧:10

第三個高度為8的木板右邊比它高的木板已經找到了,是第四個木板12,8出棧,計算a3 = 4-3-1 = 0

12比10大,10出棧 棧:空

第乙個高度為10的木板右邊比它高的木板已經找到了,是第四個木板12,所以10出棧,計算a1 = 4-1-1 = 2

棧為空,12入棧 棧:12 此時棧頂是12,也就是說要尋找比12大的木板

6比12小,6入棧 棧:6,12 此時棧頂是6,也就是說要尋找比6大的木板

掃瞄完成結束

最後棧的結構是:6,12 棧頂為6

由於最右端豎立著一塊高度無限大的木板,即存在第六塊木板高度為無窮,所以剩餘兩塊木板的演算法如下 a5 = 6-5-1 =0

a4 = 6-4-1 = 1

sum = a1 + a2 +a3 +a4 +a5 = 3

因此本題可以在o(n)o(n)的時間內迎刃而解了。

從左往右將木板節點壓棧,遇到比棧頂木板高的木板就將當前棧頂木板出棧並計算淹沒的木板數,如此迴圈直到棧頂木板高度比當前木板高或者棧為空,然後將此木板壓棧。木板全都壓棧完成後,棧內剩餘的木板都是右側沒有比它們更高的木板的,所以乙個個出棧並計算ai=n+1-temp_id-1(用最右邊無限高的木板減)

//從左往右解木板倒水

int main()

stack.push(temp);

}//現在棧中的木板右側沒有比它高的木板,用最右側無限高的木板減

while(!stack.empty())

cout<

開學第十一周

這周尤拉迴路和拓撲排序基本上做完了,補一些數學的和資料結構的,看到一道類似於暴力的題目,時間是10的12次方型別的,一看就是資料結構優化或者是有某個數論板子,對於字串,看trie的知識點,今天晚上的比賽就用到了乙個質因子的板子,找了同學的板子,一開始掉了一種情況,wa了,後面過了,但是到時間了,我去...

資料結構 第十一周教學

一 課程目標 1 掌握樹型結構的特點和基本術語 2 熟練掌握二叉樹的性質,了解相應的證明方法 3 了解二叉樹的順序儲存結構和鏈式儲存結構,熟練掌握二叉鍊錶儲存結構 通過本週內容學習,旨在讓學生們掌握樹的基本概念和性質,特別是對於二叉樹中 滿二叉樹和完全二叉樹 的理解,並且能夠利用順序結構和鏈式結構來...

《程式設計與資料結構》第十一周學習總結

什麼是生命活動週期方法?當活動開始進入執行階段後,假如使用者執行其他活動時,就需要執行onpause操作,使得減少資源的浪費。而此時的記憶體依舊占用。此時,activity仍然處於部分可見的狀態。當活動呼叫onstop方法時,首先,活動將處於不可見狀態。但是它依然保持所有狀態和成員資訊,但是它不再可...