• 栈--下一个更大的元素(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

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

    代码

    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;
        }
    }
    
  • 相关阅读:
    【转】请说出三种减少页面加载时间的方法。
    【转】Web前端性能优化——如何提高页面加载速度
    【转】数据分析sql常用整理
    【转】消息中间件系列之简单介绍
    Could not load file or assembly 'System.Core, Version=2.0.5.0 和autofac冲突的问题
    云主机与传统主机性能对比表
    真假云主机,VPS资料集合
    将网站部署到windows2003 iis6之后,出现asp.net程序页面无法访问情况
    想当然是编程最大的坑,记更新删除过期cookie无效有感
    FlashBuilder(FB/eclipse) 打开多个无效
  • 原文地址:https://www.cnblogs.com/swifthao/p/12810303.html
Copyright © 2020-2023  润新知