单调栈及其对应算法题

106 阅读1分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

单调栈的应用: ==求解下一个大于x元素或者是小于x元素的位置。==

在这里插入图片描述 在这里插入图片描述 在这个过程中,维护的是一个单调栈。

算法题目: 在这里插入图片描述 稍加分析一下就会发现,和上面上说的差不多。 做题技巧就是: 1、始终要维护一个单调栈,具体看其是递增还是递减; 2、分析判断条件,判断出栈和入栈;

class Solution {
    public int[] dailyTemperatures(int[] temperatures) {
        //单调栈   详细版
        int[] result = new int[temperatures.length];
        Stack<Integer> st = new Stack<>();

        st.push(0);  //栈中存放的是temperatures的下标
        for (int i = 1; i < temperatures.length; i++) {
            if (temperatures[i] < temperatures[st.peek()]) {  //情况一
                st.push(i);
            }else if (temperatures[i] == temperatures[st.peek()]) {  //情况二
                st.push(i);
            }else {
                while (!st.isEmpty() && temperatures[i] > temperatures[st.peek()]) {  //情况三
                    int temp = st.pop();
                    result[temp] = i - temp;
                }
                st.push(i);
            }
        }
        return result;
    }
}

在这里插入图片描述 此题求的是==下一个更大的元素==,而每日温度求的是==下一个更大的下标。== 但是思路是类似的,此题中还要多处理一步:记录nums1的下标

class Solution {
    public int[] nextGreaterElement(int[] nums1, int[] nums2) {
        //单调栈
        int[] result = new int[nums1.length];
        Arrays.fill(result,-1);
        HashMap<Integer,Integer> hash = new HashMap<>();
        Stack<Integer> st = new Stack<>();

        for (int i = 0; i < nums1.length; i++) {  //记录nums1的下标
            hash.put(nums1[i],i);
        }       

        for (int i = 0; i < nums2.length; i++) {
            while (!st.isEmpty() && nums2[i] > nums2[st.peek()]) {
                if (hash.containsKey(nums2[st.peek()])) {
                   result[hash.get(nums2[st.peek()])] = nums2[i];
                }
                st.pop();
            }
            st.push(i);
        }

        return result;
    }
}