1. 程式人生 > 其它 >Js報錯資訊

Js報錯資訊

目錄

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:棧內元素都是單調的,可以是單調遞增或者單調遞減,根據題目的具體情況決定。

  • 單調遞增棧可以找到元素向左遍歷第一個比它小的元素。
  • 單調遞減棧可以找到元素向左遍歷第一個比它大的元素。

優勢
擁有線性的時間複雜度,所有的元素只會進棧一次,而且一旦出棧後就不會再進來了。

單調棧可解決的題目