算法训练营Day58(单调栈)

739. 每日温度 

739. 每日温度 - 力扣(LeetCode)

今天正式开始单调栈,这是单调栈一篇扫盲题目,也是经典题。

大家可以读题,思考暴力的解法,然后在看单调栈的解法。 就能感受出单调栈的巧妙

单调栈可以解决的问题:

当前元素右面或者左面,第一个,比他大或者小的元素,再做其他逻辑

需要注意

单调栈存放的是下标,才能和数组中的元素形成映射

最需要关心

从栈口到栈底是递增还是递减?

结论:找第一个大的,那么递增 

        找第一个小的,那么就递减

我感觉这个单调栈不用考虑单调栈里是递增还是递减的,按照需求压栈,出栈就可以了,纠结这个递增递减没意义啊

单调栈的作用

存放遍历过的元素,让遍历的元素知道他是某个元素第一个大的

题解

class Solution {
    public int[] dailyTemperatures(int[] temperatures) {
        int len = temperatures.length;
        //栈存放的下标
        Deque stack = new LinkedList<>();
        int[] res = new int[len];
        for(int i = 0;itemperatures[stack.peek()]){
                res[stack.peek()] = i-stack.peek();
                stack.pop();
            }
            //stack为空或者不符合大于条件,压栈
            stack.push(i);
        }
        return res;
    }
}

496.下一个更大元素 I  

496. 下一个更大元素 I - 力扣(LeetCode)

这道题就是在上一道题的思路是处理结果不一样,能映射到map再进行处理,否则都直接pop掉就好了,

还有这个存放的树数据,不是距离,很简单的题

class Solution {
    public int[] nextGreaterElement(int[] nums1, int[] nums2) {
        int len1 = nums1.length;
        int len2 = nums2.length;
        int [] res = new int[len1];
        Arrays.fill(res,-1);
        HashMap map = new HashMap<>();
        for(int i = 0;i stack = new LinkedList<>();
        
        for(int i = 0;inums2[stack.peek()]){
                int temp = nums2[stack.pop()];
                if(map.containsKey(temp)){
                    res[map.get(temp)] = nums2[i];
                }
            }
            stack.push(i);
        }
        return res;
    }
}

你可能感兴趣的:(算法,算法,java,开发语言)