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

496. 下一个更大元素 I『简单』

[JavaScript 刷题] 栈 - 下一个更大元素 I, leetcode 496

[JavaScript 刷题] 栈 - 下一个更大元素 I, leetcode 496

[JavaScript 刷题] 栈 - 下一个更大元素 I, leetcode 496

496. 下一个更大元素 I