【代码随想录训练营】Day58-单调栈

代码随想录训练营 Day58

今日任务

739.每日温度
496.下一个更大元素Ⅰ
语言:Java

单调栈理论

  1. 何时用:寻找某一侧第一个比自己大或者小的元素或元素位置
  2. 单调栈中存放的元素是什么:数组下标
  3. 单调栈递增还是递减(从栈头到栈底):寻找比自己大的元素-递增,寻找比自己小的元素-递减
  4. 时间复杂度:O(N)

739. 每日温度

链接:https://leetcode.cn/problems/daily-temperatures/

class Solution {
    public int[] dailyTemperatures(int[] temperatures) {
        int[] result = new int[temperatures.length];
        Stack<Integer> st = new Stack<>();
        st.push(0);
        for(int i = 1; i < temperatures.length; i++){
            if(temperatures[i] > temperatures[st.peek()]){
                while(!st.isEmpty() && temperatures[i] > temperatures[st.peek()]){
                    int idx = st.pop();
                    result[idx] = i - idx;
                }
                st.push(i);
            }
            else if(temperatures[i] <= temperatures[st.peek()]){
                st.push(i);
            }
        }
        return result;
    }
}

496. 下一个更大元素Ⅰ

链接:https://leetcode.cn/problems/next-greater-element-i/

class Solution {
    public int[] nextGreaterElement(int[] nums1, int[] nums2) {
        int[] result = new int[nums1.length];
        for(int i = 0; i < nums1.length; i++){
            result[i] = -1;
        }
        Stack<Integer> st = new Stack<Integer>(); 
        HashMap<Integer, Integer> umap = new HashMap<Integer, Integer>();
        for(int i = 0; i < nums1.length; i++){
            umap.put(nums1[i], i);
        }
        st.push(0);
        for(int i = 1; i < nums2.length; i++){
            if(nums2[i] <= nums2[st.peek()]){
                st.push(i);
            }
            else{
                while(!st.isEmpty() && nums2[i] > nums2[st.peek()]){
                    if(umap.get(nums2[st.peek()]) != null){
                        int idx = umap.get(nums2[st.peek()]);
                        result[idx] = nums2[i];
                    }
                    st.pop();
                }
                st.push(i);
            }
        }
        return result;
    }
}

你可能感兴趣的:(代码随想录训练营,leetcode,java)