zoukankan      html  css  js  c++  java
  • 栈--下一个更大的元素(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;
        }
    }
    
  • 相关阅读:
    poj_1084 剪枝-IDA*
    搜索算法
    poj_1475 BFS+BFS
    chrome浏览器经常无响应
    charles抓包工具的使用:手机抓包设置和安装证书
    charles抓包工具的使用:概述
    不同局域网如何利用charles对app进行抓包
    fiddler之使用教程(一)
    一点感触
    单元测试框架处理多组数据的另一种写法:基于构造函数和超继承
  • 原文地址:https://www.cnblogs.com/swifthao/p/12810303.html
Copyright © 2011-2022 走看看