當前位置:
首頁 >
503. 下一个更大元素 II
發布時間:2025/1/21
25
豆豆
生活随笔
收集整理的這篇文章主要介紹了
503. 下一个更大元素 II
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
503. 下一個更大元素 II
- 題目
- 我的解答
- 分析
- 解答
- 官方解法
題目
給定一個循環數組(最后一個元素的下一個元素是數組的第一個元素),輸出每個元素的下一個更大元素。數字 x 的下一個更大的元素是按數組遍歷順序,這個數字之后的第一個比它更大的數,這意味著你應該循環地搜索它的下一個更大的數。如果不存在,則輸出 -1。
示例 1:
輸入: [1,2,1]
輸出: [2,-1,2]
解釋: 第一個 1 的下一個更大的數是 2;
數字 2 找不到下一個更大的數;
第二個 1 的下一個最大的數需要循環搜索,結果也是 2。
注意: 輸入數組的長度不會超過 10000。
來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/next-greater-element-ii
著作權歸領扣網絡所有。商業轉載請聯系官方授權,非商業轉載請注明出處。
我的解答
分析
參考496. 下一個更大元素 I,一個很直接的方式是套用之前的解法,但是這道題有點不同,I的數組無重復元素。但是II中的元素可以到循環到數組前面去查找下一個元素。所以不能用元素之作為鍵值構建字典了
循環數組的一個技巧就是*2
解答
因為不能用元素之作為鍵值構建字典,但是每一個元素的位置是唯一的,可以用元素的位置作為鍵值。
- 構建兩個棧:保存位置的stack_index和保存元素值的stack_element,以及保存字典dic(key是位置,value是下一個更大的值。沒有下一個更大值的不會保存在字典中–比如最大值)
- 接下來的思路同I:
- 遍歷2*nums –item
- 如果棧為空,索引和元素值分別入棧。
- 如果棧為非空,且item>stack_element棧頂,加入字典。dic[stack_index.pop()]=item,stack_element.pop()
- 如果棧為非空,且item<stack_element棧頂,分別壓棧stack_index和stack_element。
- 遍歷2*nums –item
- 遍歷序列[0,1,2..,n-1],如果字典中存在相應的索引,則取值為dic[index],否則為-1
精簡一點,可以省去一個數組stack_element
- stack_element相當于是取nums中的值。由于stack_element與stack_index是同步變化的。通過nums和stack_index即可實現。
- 遍歷的索引的位置在nums中的實際位置是index%l
官方解法
- 新建stack保存索引。新建保存結果數組res與nums的長度相同,保存下一個更大值。
- stack是單調遞減棧(不是索引是單調遞減的,而是索引相應的元素值是單調遞減。其實是為了確保棧中是下一個稍大的值)。
從后向前遍歷兩次列表,遍歷到第i個元素, - 如果stack為空,索引入棧,同時res[i%l]=-1。
- 如果stack為非空:
- 當前棧頂元素nums[stack[-1]]<遍歷到的nums[i%l],那么彈出棧頂元素。此時前面元素的更大值是nums[i%l]。同時res[i%l]=-1,將i%l壓入棧。
- 當前棧頂元素nums[stack[-1]]>遍歷到的nums[i%l],res[i%l]=nums[stack[-1]],然后將i%l壓入棧。
- 返回res
這種方法要確保局部有序
class Solution:def nextGreaterElements(self, nums):l = len(nums)stack = []res = [-1]*lfor i in range(2*l-1,-1,-1):while stack and nums[stack[-1]]<=nums[i%l]:stack.pop()res[i%l] = -1 if not stack else nums[stack[-1]]stack.append(i%l)return res總結
以上是生活随笔為你收集整理的503. 下一个更大元素 II的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 删除最外层的括号
- 下一篇: 1249. 移除无效的括号