栈--下一个更大的元素(leetcode 496)

题目描述

给定两个 没有重复元素 的数组 nums1 和 nums2 ,其中nums1 是 nums2 的子集。找到 nums1 中每个元素在 nums2 中的下一个比其大的值。

nums1 中数字 x 的下一个更大元素是指 x 在 nums2 中对应位置的右边的第一个比 x 大的元素。如果不存在,对应位置输出 -1 。

思路

这个题可以用暴力解法得到,但是时间复杂度是o(n^2)。

对于“下一个更大的元素”这类问题,可以用单调栈来解决。(单调栈的用途不太广泛,但很适合于处理下一个更大元素这类问题)

先不管nums1,先对nums2中的每一个元素求其下一个最大,将这个映射结果存到map中;然后遍历nums1,get到每个key的value

流程分析

假设nums2 = [2,3,5,1,0,7,3].nums2[0] = 2,将2压入栈中;nums2[1] = 3 > 2,将2出栈,3入栈,将2:3这对key value存到map中,这时便找到了第一个元素的下一个最大。接着nums2[2] = 5 > 3,将3出栈,5入栈,将 3:5 这对key value存到map中,这时便找到了第二个元素的下一个最大。接着nums2[3] = 1 < 5,将 1 入栈,此时没找到5的下一个最大。接着nums2[4] = 0 < 1,将 0 入栈,此时没找到1的下一个最大。接着nums2[5] = 7 > 0,将0出栈,此时7不能入栈,此时的栈顶元素1<7,将 0:7 这对key value存到map中,这时便找到了0的下一个最大。之后将1出栈,1:7存到map,5出栈,5:7存到map。7入栈,最后一个元素为3 < 7,入栈。没有下一个元素了,将3出栈,3:-1存到map;7出栈,7:-1存到map

在整个执行过程中,map始终都是单调的

代码

public class Solution496 {
    public int[] nextGreaterElement(int[] nums1, int[] nums2) {
        int[] ans = new int[nums1.length];
        Map<Integer,Integer> map = new HashMap<>();
        Stack<Integer> stack = new Stack<>();
        for (int i = 0;i<nums2.length;i++){
            while(!stack.empty()&&stack.peek()<nums2[i]){
                map.put(stack.pop(),nums2[i]);
            }
            stack.push(nums2[i]);
        }
        while (!stack.empty()){
            map.put(stack.pop(),-1);
        }

        for (int i = 0;i<nums1.length;i++){
            ans[i] = map.get(nums1[i]);
        }

        return ans;
    }
}

猜你喜欢

转载自www.cnblogs.com/swifthao/p/12810303.html