这道题虽然是一系列“下一个更大的元素”中的第 1 个,实际上还有一个第 0 题:Leetcode 739 Daily Temperatures。
这是一道单调栈题,可以从第 0 题简单修改而来:
class Solution {
public:
vector<int> nextGreaterElement(vector<int>& nums1, vector<int>& nums2) {
const int n = nums2.size();
unordered_map<int, int> m;
vector<int> nxt(n, -1);
stack<int> s;
for (int i = 0; i < n; ++i) {
m[nums2[i]] = i;
while (!s.empty() && nums2[s.top()] < nums2[i]) {
nxt[s.top()] = nums2[i];
s.pop();
}
s.push(i);
}
vector<int> res;
res.reserve(nums1.size());
for (const int a : nums1) res.emplace_back(nxt[m[a]]);
return res;
}
};
上面那种直接修改出来的解法显然不够简洁。简单修改就可以去掉多余的 $nxt$ 数组。
class Solution {
public:
vector<int> nextGreaterElement(vector<int>& nums1, vector<int>& nums2) {
const int n = nums2.size();
unordered_map<int, int> m;
stack<int> s;
for (int i = 0; i < n; ++i) {
while (!s.empty() && s.top() < nums2[i]) {
m[s.top()] = nums2[i];
s.pop();
}
s.push(nums2[i]);
}
vector<int> res;
res.reserve(nums1.size());
for (auto a : nums1)
if (m.find(a) != m.end())
res.emplace_back(m[a]);
else
res.emplace_back(-1);
return res;
}
};