單調棧的一些題目總結

2021-10-22 02:54:48 字數 1812 閱讀 7159

給你兩個 沒有重複元素 的陣列 nums1 和 nums2 ,其中nums1 是 nums2 的子集。

請你找出 nums1 中每個元素在 nums2 中的下乙個比其大的值。

nums1 中數字 x 的下乙個更大元素是指 x 在 nums2 中對應位置的右邊的第乙個比 x 大的元素。如果不存在,對應位置輸出 -1 。

輸入: nums1 = [4,1,2], nums2 = [1,3,4,2].

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

解釋:對於 num1 中的數字 4 ,你無法在第二個陣列中找到下乙個更大的數字,因此輸出 -1 。

對於 num1 中的數字 1 ,第二個陣列中數字1右邊的下乙個較大數字是 3 。

對於 num1 中的數字 2 ,第二個陣列中沒有下乙個更大的數字,因此輸出 -1 。

1,因為num1是num2的子集,又因為num1和num2都不存在重複元素,所以我們可以直接將num2中的每個元素的下乙個最大元素找出,然後用乙個字典dic={}存放,最後遍歷num1中每個元素,對應在dic中找出。

2:遍歷num2中每個元素i,始終維護乙個單調遞減的棧stack。

3:只要num2[i]>stack[-1] and stack不為空。就stack.pop(),並且 dic[stack.pop()]=nums2[i],最後將num2【i】加入到stack中。

python**:

class

solution

:def

nextgreaterelement

(self, nums1: list[

int]

, nums2: list[

int])-

> list[

int]

: stack=

dic=

n=len(nums2)

for i in

range

(n):

while stack and stack[-1

]: dic[stack.pop()]

=nums2[i]

)return

[dic.get(x,-1

)for x in nums1]

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

例如,給定乙個列表 temperatures = [73, 74, 75, 71, 69, 72, 76, 73],你的輸出應該是 [1, 1, 4, 2, 1, 1, 0, 0]。

python**

class

solution

: def dailytemperatures

(self,

t: list[int])-

> list[int]

: stack =

n =len(t)

res =[0

for k in

range

(n)]

for i in

range

(n):

while stack and t

[stack[-1

]]<

t[i]

: res[stack[-1

]]= i - stack[-1

] stack.

pop(

) stack.

(i)return res

一道單調棧的題目

今天偶然遇到一道單調棧的題目,順便複習下閒置已久的演算法知識,題目的意思大致就是給你乙個區間,找到子段和 k的乙個最小子段。子段問題的關鍵是字首和,先求一下 int sum 50005 for int i 0 i sum i 1 sum i a i 緊接著,關鍵就是維持乙個單調棧,下面解釋一下什麼是...

單調棧的介紹以及一些基本性質

單調棧就是棧內元素單調遞增或者單調遞減的棧,單調棧只能在棧頂操作。為了更好的理解單調棧,則可將單調棧用生活情形模擬實現,例如 我們借用拿號排隊的場景來說明下。現在有很多人在排隊買可樂,每個人手裡都拿著號,越靠前的人手裡的號越小,但是號不一定是連續的。小明拿了號後並沒有去排隊,而是跑去約會了。等他回來...

ACM解題技巧 (單調棧) 題目總結

單調是一種思想,當我們解決問題的時候發現有許多冗雜無用的狀態時,我們可以採用單調思想,用單調棧或類似於單調佇列的方法去除冗雜狀態,儲存我們想要的狀態題目傳送門hdu 1506 poj2559 最大矩形面積 思路 棧裡面去維護乙個長方形的高,保持這個單調遞增,遇到遞減,就出棧然後更新。include ...