496. 下一个更大元素 I
Posted Debroon
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了496. 下一个更大元素 I相关的知识,希望对你有一定的参考价值。
496. 下一个更大元素 I
题目
传送门:https://leetcode.cn/problems/next-greater-element-i/
算法设计:单调栈
对于高效计算每个元素右边的第一个更大值,其实有一种数据结构叫单调栈,能在
O
(
n
)
O(n)
O(n) 时间(暴力是平方量级)计算出下一个更大元素的函数。
- 单调栈,就是栈里面的元素只能按从小到大或从大到小排列。
又因为需要查 nums1 才选出 nums2 的第一个更达值,我们把 nums2 中每个元素的下一个更大元素算出来存到一个哈希数组里:
- nums1 作为键,nums2 作为值,查表即可。
class Solution
public:
vector<int> nextGreaterElement(vector<int>& nums1, vector<int>& nums2)
stack<int> st;
unordered_map<int, int> hashmap; // 存放答案的数组
// 求左边第一个小于它的数:维护一个沿栈顶方向递增的栈,并从头到尾遍历数组
// 求左边第一个大于它的数:维护一个沿栈顶方向递减的栈,并从头到尾遍历数组
// 求右边第一个小于它的数:维护一个沿栈顶方向递增的栈,并从尾到头遍历数组
// 求右边第一个大于它的数:维护一个沿栈顶方向递减的栈,并从尾到头遍历数组
for (int i = nums2.size() - 1; i >= 0; i--) // 求右边第一个大于它的数,栈顶递减,倒着往栈里放
while (!st.empty() && st.top() <= num2[i]) // 找到第一个比栈顶元素更大的值
st.pop(); // 栈顶出栈
hashmap[nums2[i]] = st.empty() ? -1 : st.top(); // 存储 nums2[i] 后面更大的数(答案),要么-1,要么当前栈顶
st.push(nums2[i]); // 入栈,右边第一个更大值
vector<int> res(nums1.size());
for (int i = 0; i < nums1.size(); ++i) // 遍历 nums1
res[i] = hashmap[nums1[i]]; // 从 hashMap 中找到对应的数
return res;
;
以上是关于496. 下一个更大元素 I的主要内容,如果未能解决你的问题,请参考以下文章
LeetCode 496. 下一个更大元素 I(Next Greater Element I) 35
[JavaScript 刷题] 栈 - 下一个更大元素 I, leetcode 496
[JavaScript 刷题] 栈 - 下一个更大元素 I, leetcode 496