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