算法day41-单调栈(1)

目录

  1. 每日温度
  2. 下一个更大元素I
  3. 下一个更大元素II

一、每日温度

 https://leetcode.cn/problems/daily-temperatures/description/?envType=problem-list-v2&envId=8At1GmaZ

 

class Solution {
    public int[] dailyTemperatures(int[] temperatures) {
        int length = temperatures.length;
        int[] res = new int[length];
        Deque<Integer> stack = new LinkedList<>();
        for(int i=0; i<length; i++){
            int temperature = temperatures[i];
            while(!stack.isEmpty() && temperature > temperatures[stack.peek()]){
                int preIndex = stack.pop();
                res[preIndex] = i-preIndex;     //栈顶元素碰到最近的比它高的温度了!
            }
            stack.push(i);
        }
        return res;
    }

}

 

二、下一个更大元素I

https://leetcode.cn/problems/next-greater-element-i/?envType=problem-list-v2&envId=8At1GmaZ

 

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);
        Map<Integer,Integer> map = new HashMap<>();
        Deque<Integer> stack = new LinkedList<>();
        for(int i=0; i<len2; i++){
            int num = nums2[i];
            while(!stack.isEmpty() && num > stack.peek()){
                int temp = stack.pop();
                map.put(temp, num);
            }
            stack.push(num);
        }
        for(int i=0; i<len1; i++){
            res[i] = map.getOrDefault(nums1[i], -1);
        }
        return res;
    }
}

 

三、下一个更大元素II

 https://leetcode.cn/problems/next-greater-element-ii/?envType=problem-list-v2&envId=8At1GmaZ

 

class Solution {
    public int[] nextGreaterElements(int[] nums) {
        int len = nums.length;
        int[] res = new int[len];
        Deque<Integer> stack = new LinkedList<>();
        Arrays.fill(res, -1);
        for(int i=0; i<2*len - 1; i++){
            int idx = i % len;
            int num = nums[idx];
            while(!stack.isEmpty() && num > nums[stack.peek()]){
                int prevIdx = stack.pop();
                res[prevIdx] = num;
            }
            stack.push(idx);
        }
        return res;
    }
}

 

posted @ 2025-06-14 19:32  筱倩  阅读(236)  评论(0)    收藏  举报