LeetCode 第496题:下一个更大的元素

题目描述

** 解题思路:**

  • 暴力法很简单,两层for循环即可。
  • 但是,评论区有人说用单调栈来做。然后还配上了这个图,以高个矮个来比喻,真是太强了!!!


    单调栈
  • 这种解法是解一类题的,所以应该需要记住模板:
public static int[] nextGreaterElement(int[] nums){
        int[] ans = new int[nums.length]; // 存放答案的数组
        Stack<Integer> stack = new Stack<>();
        for(int i = nums.length - 1; i >= 0 ; i--){ // 倒着往栈里放
            while(!stack.isEmpty() && stack.peek() <= nums[i]){
                stack.pop(); // 矮个起开,反正也被挡着了。。。
            }
            ans[i] = stack.isEmpty() ? -1 : stack.peek(); // 这个元素身后的第一个高个
            stack.push(nums[i]); // 进队,接受之后的身高判定吧!
        }
        return ans;
    }

这道题的解法

class Solution {
    public int[] nextGreaterElement(int[] nums1, int[] nums2) {
        int[] result = new int[nums1.length];
        Map<Integer, Integer> map = nextGreater(nums2);
        for(int i = 0; i < nums1.length; i++){
            result[i] = map.get(nums1[i]);
        }
        return result;
    }

    public Map<Integer, Integer> nextGreater(int[] nums){
        Map<Integer, Integer> map = new HashMap<>();
        Stack<Integer> stack = new Stack<>();
        for(int i = nums.length - 1; i >= 0; i--){
            while(!stack.isEmpty() && stack.peek() <= nums[i]){
                stack.pop();
            }
            map.put(nums[i], stack.isEmpty() ? -1 : stack.peek());
            stack.push(nums[i]);
        }
        return map;
    }
}

推荐阅读更多精彩内容