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
入棧
如果棧頂元素存在,考慮v
和s[-1]
的關係,首先v
和s
中的元素位置關係是: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 大的元素。如果不存在,對應位置輸出 ...