給你兩個 沒有重複元素 的陣列 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 ...