LeetCode——496. 下一个更大元素 I

下一个更大元素

题目

给你两个 没有重复元素 的数组 nums1 和 nums2 ,其中nums1 是 nums2 的子集。

请你找出 nums1 中每个元素在 nums2 中的下一个比其大的值。

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

题目传送门

思路

没有重复元素的数组,并且num1是nums2的子集。那么只要找出nums2的每个数的下一个更大的元素,nums1自然就能够得到结果了!

利用一个单调栈,如果当前数值是小于栈顶的数值,那么就将栈顶数值给记下来【这里可以利用一个哈希表】,如果当前数值大于栈顶的数值,那么就将栈顶的数值剔除掉,直到栈为空或者栈顶数值小于当前数值。然后将其存放进哈希表后,当前数值必须要压入栈中【因为可能是前面数值的下一个更大元素】!

代码

import java.util.Deque;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.Map;

/**
 * 下一个更大的元素
 */
class Solution {
    public int[] nextGreaterElement(int[] nums1, int[] nums2) {
        Deque<Integer> deque = new LinkedList<>();
        Map<Integer,Integer> map = new HashMap<>();
        int length = nums2.length;
        for (int i=length-1;i>=0;--i)
        {
            int temp = nums2[i];
            // 只要当前栈不为空 且 栈顶数值必须大于当前数值
            while (!deque.isEmpty() && deque.peek()<temp)
                deque.pop(); // 否则弹出栈顶元素
                
            // 找到当前元素的下一个更大元素后,将其记录在哈希表里面    
            map.put(temp,deque.isEmpty()?-1:deque.peek());
            // 将当前数值压入栈中,因为当前数值可能是前面数值的下一个更大的数
            deque.push(temp);
        }
        int len = nums1.length;
        int ans[] =new int[len];
        // 从哈希表中取出结果即可
        for (int i=0;i<len;++i)
            ans[i]=map.get(nums1[i]);
        return  ans;
    }
}

结果

在这里插入图片描述
本来已经将单调栈忘得七七八八了,又开始回忆起来这个东西了!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值