随想录训练营Day58 | DP - - 739. 每日温度, 496.下一个更大元素 I

81 阅读1分钟

随想录训练营Day58 | DP - - 739. 每日温度, 496.下一个更大元素 I

标签: LeetCode闯关记


739. 每日温度

class Solution {
    public int[] dailyTemperatures(int[] temperatures) {
        int len = temperatures.length;
        int[] result = new int[len];
        Deque<Integer> deque = new LinkedList<>();//栈中存放的是已经遍历过的元素的下标
        deque.add(0);
        for (int i = 1; i < len; i++) {
            while(deque.peek() != null && temperatures[i] > temperatures[deque.peek()]){
                result[deque.peek()] = i - deque.peek();
                deque.pop();
            }
            deque.push(i);//犯错 写成了 deque.add(i)  ____总是把deque这个双端队列搞错
        }
        return result;
    }
}

496.下一个更大元素 I

注意点:

  1. result[]数组的长度是nums1的长度
  2. 单调栈遍历的是nums2的元素
  3. 如何映射?
  4. 这一次,我的解法中,单调栈保留的是nums2的元素而不是元素下标
class Solution {
    public int[] nextGreaterElement(int[] nums1, int[] nums2) {
        int len = nums1.length;
        int[] result = new int[len];
        for (int i = 0; i < result.length; i++) {
            result[i] = -1;
        }
        Stack<Integer> stack = new Stack<>();//栈中存放的是已经遍历过的nums2的元素
        HashMap<Integer, Integer> map = new HashMap<>();//注意映射
        // for (int i = 0; i < len; i++) {
        //     map.put(nums1[i],i);
        // }
        Arrays.fill(res, -1);
        for (int i = 0; i < nums2.length; i++) {
            while(!stack.isEmpty() && nums2[i] > stack.peek()){
                if(map.containsKey(stack.peek())){//和739每日温度的区别
                    result[map.get(stack.peek())] = nums2[i];
                }
                stack.pop();
            }
            stack.push(nums2[i]);
        }
        return result;
    }
}