天天看點

下一個更大元素

使用單調棧解決這類問題

假設nums1是nums2的子集,且沒有重複元素,使用兩個工具,一個是輔助棧(倒序插入nums2),一個是哈希表,

解題思路: 将nums2中的每一個元素對應的右邊第一個比他大的元素記錄下來,然後将這個值與他右邊的第一個大于它的值同時存入哈希表中,在之後周遊nums1的時候可以直接把想要的答案找出來。輔助棧的作用是,在确定一個元素右側的第一個元素比這個元素大的時候,如果越靠近這個元素同時比後面的元素要大,那麼肯定在确定右側第一個大元素的時候,肯定就沒有後面元素的事了,此時把後面的元素都彈出

例題:LeetCode-496

https://leetcode-cn.com/problems/next-greater-element-i/
class Solution {
    public int[] nextGreaterElement(int[] nums1, int[] nums2) {
        int n = nums1.length;
        int m = nums2.length;
        Deque<Integer> d = new ArrayDeque<>();
        Map<Integer, Integer> map = new HashMap<>();
        for(int i = m - 1; i >= 0; i--){
            int x = nums2[i];
            while(!d.isEmpty() && d.peekLast() <= x) d.pollLast();
            //  pollLast 檢索并删除此清單的最後一個元素
            map.put(x, d.isEmpty() ? -1 : d.peekLast());
            d.addLast(x);//此雙端隊列的末尾插入指定的元素
        }
        int[] ans = new int[n];
        for(int i = 0;i < n;i++) ans[i] = map.get(nums1[i]);
        return ans;
    }
}