代码随想录算法训练营第五十三天 | 739.每日温度 496.下一个更大的元素I 503.下一个更大的元素II

739.每日温度

题目链接 文章讲解 视频讲解
单调栈适合的场景:求当前元素左面或右面第一个比它大或小的元素

  • 单调栈里存什么元素
    只要存下标就可以了,比较元素时可以通过下标取元素
  • 单调栈是单调增还是单调减(从栈顶到栈底)
    使用单调增的单调栈

解题步骤:

  1. 遍历数组,当栈空时直接入栈
  2. 如果栈不空比较当前元素与栈顶元素,如果当前元素大于栈顶元素,则记录距离,并弹出栈顶元素
  3. 循环第二步直到栈空或者栈顶元素不小于当前元素,将当前元素入栈
class Solution {
public:
    vector<int> dailyTemperatures(vector<int>& temperatures) {
        stack<int> st;
        vector<int> result(temperatures.size(), 0);

        for(int i = 0; i < temperatures.size(); ++i) {

            while (!st.empty() && temperatures[i] > temperatures[st.top()]) {
                result[st.top()] = i - st.top();
                st.pop();
            }

            st.push(i);
        }
        return result;      
    }
};

496.下一个更大元素I

题目链接 文章讲解 视频讲解

思路:建立一个map映射,将nums1中的元素和下标做映射,使得根据元素可以获得下标

class Solution {
public:
    vector<int> nextGreaterElement(vector<int>& nums1, vector<int>& nums2) {
        stack<int> st;
        vector<int> result(nums1.size(), -1);
        unordered_map<int, int> umap;

        for(int i = 0; i < nums1.size(); ++i) umap[nums1[i]] = i;

        for(int i = 0; i < nums2.size(); ++i) {
            while(!st.empty() && nums2[i] > st.top()) {
                if(umap.find(st.top()) != umap.end())
                    result[umap[st.top()]] = nums2[i];
                st.pop();
            }
            st.push(nums2[i]);
        }
        return result;
    }
};

503.下一个更大的元素II

题目链接 文章讲解 视频讲解

只需将数组遍历两遍,计算下标时使用i % nums.size()

class Solution {
public:
    vector<int> nextGreaterElements(vector<int>& nums) {
        stack<int> st;
        vector<int> result(nums.size(), -1);

        for(int i = 0; i < 2 * nums.size(); ++i) {
            while(!st.empty() && nums[i % nums.size()] > nums[st.top()]) {
                result[st.top()] = nums[i % nums.size()];
                st.pop();
            }
            st.push(i % nums.size());
        }
        return result;
    }
};
posted @ 2024-07-05 22:12  深蓝von  阅读(1)  评论(0编辑  收藏  举报