下乙個更大元素 123

2021-10-21 06:30:34 字數 4848 閱讀 3190

496. 下乙個更大元素 i - 力扣(leetcode) (leetcode-cn.com)

503. 下乙個更大元素 ii - 力扣(leetcode) (leetcode-cn.com)

556. 下乙個更大元素 iii - 力扣(leetcode) (leetcode-cn.com)

條件

1 <= nums1.length <= nums2.length <= 1000

0 <= nums1[i], nums2[i] <= 10^4

nums1和nums2中所有整數 互不相同

nums1 中的所有整數同樣出現在 nums2 中

方法一 暴力

class

solution

:def

nextgreaterelement

(self, nums1: list[

int]

, nums2: list[

int])-

> list[

int]

: ans =[-

1]*len

(nums1)

d2 =

dict()

for ind,val in

enumerate

(nums2)

: d2[val]

= ind

# 序號,值

for k,v in

enumerate

(nums1)

:for j in

range

(d2[v]+1

,len

(nums2)):

if nums2[j]

> v:

ans[k]

= nums2[j]

break

return ans

方法二 單調棧維護乙個棧s和乙個hashmapdct先考慮nums2中的元素

對於v in nums2和棧頂元素s[-1],如果棧頂元素不存在,即棧空,那麼v入棧

如果棧頂元素存在,考慮vs[-1]的關係,首先vs中的元素位置關係是:v是s中元素後面的元素,即v排在後面,那麼如果v大於s[-1],意味著s[-1]找到了乙個大於它的元素,我們出棧,計dct[s[-1]] = v,表示s[-1]這個元素的下乙個更大元素是v

對於棧中所有元素,我們重複執行上述步驟,直到棧為空或者s[-1]大於等於v,即v不是s[-1]的下乙個更大元素,那麼v也不是s[-2, -3 ,...0]中的更大元素

s實際上從棧底到棧頂保持乙個單調不增的性質

最後我們遍歷完nums2中的元素,如果s中仍然有元素,那麼我們出棧將它們的value設定為-1,表示並沒有下乙個更大的元素

想清楚上面的性質之後,我們就能寫出這道題的答案了

class

solution

:def

nextgreaterelement

(self, nums1: list[

int]

, nums2: list[

int])-

> list[

int]

: ans =[-

1]*len

(nums1)

stack =

dct =

dict()

for v in nums2:

iflen

(stack)==0

:else

:while

len(stack)!=0

and stack[-1

]< v:

dct[stack[-1

]]= v stack.pop(

)while

len(stack)!=0

: dct[stack[-1

]]=-

1 stack.pop(

)for ind,val in

enumerate

(nums1)

: ans[ind]

= dct[val]

return ans

方法1 暴力勉強通過

方法2 單調棧還是用和第一問一樣的思路,但是這道題多了重複元素+迴圈陣列這兩個因素,迴圈陣列乙個直觀的方法就是nums.extend(nums)

考慮到重複元素,我們把對每個入棧的元素,記錄它的下標,然後出棧的時候更新對應位置的值即可

class

solution

:def

nextgreaterelements

(self, nums: list[

int])-

> list[

int]

: s =

ans =[-

1]*len

(nums)

size =

len(nums)

nums.extend(nums)

# 注意迴圈範圍

for i in

range

(len

(nums)-1

):v = nums[i]

# 發現下乙個更大的元素

while

len(s)!=0

and s[-1

][0]

< v:

ans[s.pop()[

1]% size]

= v # v 和 ind

(v,i)

)return ans

但我們不用真正的擴充套件乙個陣列,而是採用下標取餘的方式即可

class

solution

:def

nextgreaterelements

(self, nums: list[

int])-

> list[

int]

: s =

ans =[-

1]*len

(nums)

size =

len(nums)

for i in

range(2

*size-1)

: v = nums[i%size]

while

len(s)!=0

and s[-1

][0]

< v:

ans[s.pop()[

1]% size]

= v # v 和 ind

(v,i)

)return ans

更進一步的,我們優化入棧的元素結構,我們直接入棧下標,而不是元素

class

solution

:def

nextgreaterelements

(self, nums: list[

int])-

> list[

int]

: s =

ans =[-

1]*len

(nums)

size =

len(nums)

for i in

range(2

*size-1)

: v = nums[i%size]

while

len(s)!=0

and nums[s[-1

]]< v:

ans[s.pop()]

= v # v 和 ind

return ans

這道題和全排列的方法掛鉤,生成全排列的方式不熟悉,先留

下乙個更大元素 III

參考 感謝!給定乙個32位正整數 n,你需要找到最小的32位整數,其與 n 中存在的位數完全相同,並且其值大於n。如果不存在這樣的32位整數,則返回 1。示例 1 輸入 12 輸出 21 示例 2 輸入 21 輸出 1 class solution int nextgreaterelement in...

下乙個更大元素 II

原題指路 下乙個更大元素 ii 給定乙個迴圈陣列 最後乙個元素的下乙個元素是陣列的第乙個元素 輸出每個元素的下乙個更大元素。數字 x 的下乙個更大的元素是按陣列遍歷順序,這個數字之後的第乙個比它更大的數,這意味著你應該迴圈地搜尋它的下乙個更大的數。如果不存在,則輸出 1。emmmmmm首先吐槽一下本...

下乙個更大元素 I

給定兩個 沒有重複元素 的陣列 nums1 和 nums2 其中nums1 是 nums2 的子集。找到 nums1 中每個元素在 nums2 中的下乙個比其大的值。nums1 中數字 x 的下乙個更大元素是指 x 在 nums2 中對應位置的右邊的第乙個比 x 大的元素。如果不存在,對應位置輸出 ...