Js報錯資訊
阿新 • • 發佈:2022-03-18
目錄
503. 下一個更大元素 II
思路
可以使用單調棧解決本題。
單調棧中儲存的是下標,從棧底到棧頂的下標在陣列 nums 中對應的值是單調不升的。
每次我們移動到陣列中的一個新的位置 i,我們就將當前單調棧中所有對應值小於 nums[i] 的下標彈出單調棧,這些值的下一個更大元素即為 nums[i]。
注意到只遍歷一次序列是不夠的,例如遍歷序列 [2,3,1] 後元素 [1] 的下一個更大元素還是不知道。我們可以把這個迴圈陣列「拉直」(處理時對下標取模),即複製該序列的前 n−1 個元素拼接在原序列的後面,將這個新序列當作普通序列繼續處理。
程式碼
class Solution { public int[] nextGreaterElements(int[] nums) { int n = nums.length; int[] ret = new int[n]; Arrays.fill(ret, -1); Deque<Integer> stack = new LinkedList<Integer>(); for (int i = 0; i < n * 2 - 1; i++) { while (!stack.isEmpty() && nums[stack.peek()] < nums[i % n]) { ret[stack.pop()] = nums[i % n]; } stack.push(i % n); } return ret; } }
單調棧
單調棧簡介
單調棧 Monotone Stack:棧內元素都是單調的,可以是單調遞增或者單調遞減,根據題目的具體情況決定。
- 單調遞增棧可以找到元素向左遍歷第一個比它小的元素。
- 單調遞減棧可以找到元素向左遍歷第一個比它大的元素。
優勢
擁有線性的時間複雜度,所有的元素只會進棧一次,而且一旦出棧後就不會再進來了。