leetcode刷題筆記 棧1

2021-10-05 11:04:14 字數 1768 閱讀 6407

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

這道題的思路還是使用雜湊表+陣列分割,還有說用單調棧的,不過這裡沒有用到,下面放解法:

class

solution

:def

nextgreaterelement

(self, nums1: list[

int]

, nums2: list[

int])-

> list[

int]

: dic=

res=

for i in

range

(len

(nums2)):

dic[nums2[i]]=i

for num1 in nums1:

for i in

range

(dic[num1]

,len

(nums2)):

if nums2[i]

>num1:

)break

elif nums2[i]

==nums2[-1

]:-1

)return res

但是這裡有乙個需要注意的點那就是for i in range(dic[num1],len(nums2))。為什麼不是dic[num1]+1呢,如果dic[num1]對應的是nums2陣列的最後乙個數,那麼再+1這個迴圈就不存在了,結果也就因此會少乙個-1,這裡需要注意。

這裡同樣,我們來看一下呼叫單調棧的c++演算法:

思路貼上一位大佬的:

對於nums2的元素,維護乙個單調不增的棧。依次掃瞄nums2的元素,假如掃到第i位,而且當前棧頂元素小於第i位元素,則棧頂元素找到了下乙個比它大的元素。將其記錄到雜湊表中。否則將第i位元素入棧。當掃瞄完nums2,留在棧中的元素都是沒有比它大的元素存在的。最後,對於nums1的每個元素,依次查詢雜湊表即可得到他們的下乙個更大元素。

class

solution

sk.push

(n);

}while

(!sk.

empty()

)for

(int n: nums1)

return res;}}

;

這裡面用到了一種新的for迴圈,稱為基於範圍的for迴圈,新出現於c++11。下面兩種寫法表達的意思相同:

for

(int n:nums2)

for(

int n=

0;n<

len(nums2)

;n++

)

LeetCode刷題筆記1

for迴圈新用法,題目217 2.map和unordered map 有序和無序的區別,無序更快,題目 217 而c 標準庫的hashmap其實叫作std unordered map,其增加和查詢的時間複雜度才是 o 1 o 1 o 1 它提供了類似map的方法。在c 11下直接使用標頭檔案 inc...

leetcode刷題筆記 棧4

給出由小寫字母組成的字串 s,重複項刪除操作會選擇兩個相鄰且相同的字母,並刪除它們。在 s 上反覆執行重複項刪除操作,直到無法繼續刪除。在完成所有重複項刪除操作後返回最終的字串。答案保證唯一。輸入 abbaca 輸出 ca 解釋 例如,在 abbaca 中,我們可以刪除 bb 由於兩字母相鄰且相同,...

LeetCode刷題筆記 155 最小棧

設計乙個支援 push,pop,top 操作,並能在常數時間內檢索到最小元素的棧。push x 將元素 x 推入棧中。pop 刪除棧頂的元素。top 獲取棧頂元素。getmin 檢索棧中的最小元素。略看sdc1的時候感覺getmin 有問題,但其實push 和pop 寫的很巧妙 比如依次錄入5,4,...