阿犇

记录生活中的点点滴滴

0%

下一个更大元素I

Trace

10.26 下一个更大元素

传送门:https://leetcode-cn.com/problems/next-greater-element-i/

Problem

给你两个 没有重复元素 的数组 nums1nums2 ,其中nums1nums2 的子集。

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

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

示例 1:

1
2
3
4
5
6
输入: nums1 = [4,1,2], nums2 = [1,3,4,2].
输出: [-1,3,-1]
解释:
对于 num1 中的数字 4 ,你无法在第二个数组中找到下一个更大的数字,因此输出 -1 。
对于 num1 中的数字 1 ,第二个数组中数字1右边的下一个较大数字是 3 。
对于 num1 中的数字 2 ,第二个数组中没有下一个更大的数字,因此输出 -1 。

示例 2:

1
2
3
4
5
输入: nums1 = [2,4], nums2 = [1,2,3,4].
输出: [3,-1]
解释:
  对于 num1 中的数字 2 ,第二个数组中的下一个较大数字是 3 。
对于 num1 中的数字 4 ,第二个数组中没有下一个更大的数字,因此输出 -1 。

提示:

  • 1 <= nums1.length <= nums2.length <= 1000
  • 0 <= nums1[i], nums2[i] <= 10^4

  • nums1nums2中所有整数 互不相同

  • nums1 中的所有整数同样出现在 nums2

思路

碰到求下一个更大的元素/上一个更小的元素,用单调栈。

预处理$nums2$,倒叙遍历$nums2$,用单调栈维护当前位置右边的更大的元素列表,栈内的元素从栈底到栈顶是单调递减的。

如果存在$i>j$,并且$nums2[i]<nums2[j]$,则$nums2[i]$不会成为答案,要从栈中弹出。

每个数字的结果用哈希表记录一下。

程序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
class Solution {
public:
int tt;
int stk[1010];
// 哈希表
// 存每个元素右边第一个比它大的
unordered_map<int,int> mp;
vector<int> nextGreaterElement(vector<int>& nums1, vector<int>& nums2) {
// 单调栈
// 如果出现i>j且a[i]<=a[j],则把i出栈
// 倒序遍历nums2

for(int i=nums2.size()-1;i>=0;i--){
while(tt&&nums2[i]>=stk[tt]){
tt--;
}
if(tt){
mp[nums2[i]]=stk[tt];
}
else{
mp[nums2[i]]=-1;
}
stk[++tt]=nums2[i];
}

vector<int> ans(nums1.size());
for(int i=0;i<nums1.size();i++){
ans[i]=mp[nums1[i]];
}
return ans;
}
};
您的支持是我继续创作的最大动力!