LeetCode-496. 下一个更大元素 I
题目来源
题目详情
nums1
中数字 x
的 下一个更大元素 是指 x
在 nums2
中对应位置 右侧 的 第一个 比 x
大的元素。
给你两个 没有重复元素 的数组 nums1
和 nums2
,下标从 0 开始计数,其中nums1
是 nums2
的子集。
对于每个 0 <= i < nums1.length
,找出满足 nums1[i] == nums2[j]
的下标 j
,并且在 nums2
确定 nums2[j]
的 下一个更大元素 。如果不存在下一个更大元素,那么本次查询的答案是 -1
。
返回一个长度为 nums1.length
的数组 ans
作为答案,满足 ans[i]
是如上所述的 下一个更大元素 。
示例 1:
输入: nums1 = [4,1,2], nums2 = [1,3,4,2].
输出: [-1,3,-1]
解释: nums1 中每个值的下一个更大元素如下所述:
- 4 ,用加粗斜体标识,nums2 = [1,3,4,2]。不存在下一个更大元素,所以答案是 -1 。
- 1 ,用加粗斜体标识,nums2 = [1,3,4,2]。下一个更大元素是 3 。
- 2 ,用加粗斜体标识,nums2 = [1,3,4,2]。不存在下一个更大元素,所以答案是 -1 。
示例 2:
输入: nums1 = [2,4], nums2 = [1,2,3,4].
输出: [3,-1]
解释: nums1 中每个值的下一个更大元素如下所述:
- 2 ,用加粗斜体标识,nums2 = [1,2,3,4]。下一个更大元素是 3 。
- 4 ,用加粗斜体标识,nums2 = [1,2,3,4]。不存在下一个更大元素,所以答案是 -1 。
提示:
1 <= nums1.length <= nums2.length <= 1000
0 <= nums1[i], nums2[i] <= 104
nums1
和nums2
中所有整数 互不相同nums1
中的所有整数同样出现在nums2
中
进阶: 你可以设计一个时间复杂度为 O(nums1.length + nums2.length)
的解决方案吗?
相似题目
503. 下一个更大元素 II
496. 下一个更大元素 I
题解分析
解法一:单调栈
本题其实是单调栈的模板题,只不过在基础单调栈的基础上增加了一些前置条件的限制,比如由一个数组变为了两个数组。
这里我们可以通过维护一个单调递减栈来求解下一个更大的元素,只有栈是单调递减的我们才能求解它的下一个更大的元素。
对于多数组的问题,我们可以使用一个map记录好第二个数组中下一个最大元素的相关信息,然后再遍历一次第一个数组,并从map中取出对应的结果即可。
class Solution {
public int[] nextGreaterElement(int[] nums1, int[] nums2) {
HashMap<Integer, Integer> map = getNextGreatEle(nums2);
int n = nums1.length;
int[] res = new int[n];
for(int i=0; i<n; i++){
res[i] = map.getOrDefault(nums1[i], -1);
}
return res;
}
private HashMap<Integer, Integer> getNextGreatEle(int[] nums){
HashMap<Integer, Integer> map = new HashMap<>();
int n = nums.length;
// 维护一个递减队列
LinkedList<Integer> sta = new LinkedList<>();
for(int i=0; i<n; i++){
int now = nums[i];
while(!sta.isEmpty() && sta.peek() < now){
int pre = sta.poll();
map.put(pre, now);
}
sta.push(now);
}
while(!sta.isEmpty()){
map.put(sta.poll(), -1);
}
return map;
}
}
Either Excellent or Rusty