【LeetCode】496.下一个更大元素I

496.下一个更大元素I

知识点:栈;哈希表;

题目描述

给你两个 没有重复元素 的数组 nums1 和 nums2 ,其中nums1 是 nums2 的子集。
请你找出 nums1 中每个元素在 nums2 中的下一个比其大的值。
nums1 中数字 x 的下一个更大元素是指 x 在 nums2 中对应位置的右边的第一个比 x 大的元素。如果不存在,对应位置输出 -1

示例
输入: nums1 = [4,1,2], nums2 = [1,3,4,2]. 输出: [-1,3,-1] 解释: 对于 num1 中的数字 4 ,你无法在第二个数组中找到下一个更大的数字,因此输出 -1 对于 num1 中的数字 1 ,第二个数组中数字1右边的下一个较大数字是 3 对于 num1 中的数字 2 ,第二个数组中没有下一个更大的数字,因此输出 -1
提示
  • num1和num2中所有整数互不相同

解法一:暴力法

直接遍历数组1,然后对于数组2从后往前找。

class Solution { public int[] nextGreaterElement(int[] nums1, int[] nums2) { int[] maxArray = new int[nums1.length]; int j = nums2.length; int max = -1; for(int i = 0; i < nums1.length; i++){ while(nums2[j-1] != nums1[i]){ if(nums2[j-1] > nums1[i]) max = nums2[j-1]; j--; } maxArray[i] = max; max = -1; j = nums2.length; } return maxArray; } }

时间复杂度:O(MN);

解法二:单调栈+哈希表

这道题目可以采用单调栈的方法,什么是单调栈呢,就是保证栈从上到下是单调的。
所以这道题目可以这样:我们先遍历nums2数组,从头开始,如果遍历到的元素大于栈顶的元素,那证明这就是栈顶元素对应的那个下一个比它更大的元素,用hashmap把它存起来,如果不是,那就也把这个元素压栈;这时候压栈的都是小于栈顶元素的,所以栈其实是单调的,直到找到比它大的,接着依次与栈顶元素比较;然后再对应nums1去在hashmap里寻找就可以了;

class Solution { public int[] nextGreaterElement(int[] nums1, int[] nums2) { Stack<Integer> stack = new Stack<>(); Map<Integer,Integer> hashMap = new HashMap<>(); for(int i = 0; i < nums2.length; i++){ if(stack.isEmpty()) stack.push(nums2[i]); while(!stack.isEmpty() && nums2[i] > stack.peek()){ hashMap.put(stack.pop(),nums2[i]); } stack.push(nums2[i]); } int[] maxArray = new int[nums1.length]; for(int i = 0; i < nums1.length; i++){ maxArray[i] = hashMap.getOrDefault(nums1[i], -1); //注意这个方法 } return maxArray; } }

时间复杂度:O(N+M):对于两个数组各遍历一次就可以了;

体会

学会这种单调栈的思想,其次要学会用hashMap;


__EOF__

本文作者Curryxin
本文链接https://www.cnblogs.com/Curryxin/p/14777899.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   Curryxin  阅读(69)  评论(0编辑  收藏  举报
编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
Live2D
欢迎阅读『【LeetCode】496.下一个更大元素I』
点击右上角即可分享
微信分享提示