单调栈

739每日温度

单调栈模板题

class Solution {
public:
    vector<int> dailyTemperatures(vector<int>& temperatures) {
        int n=temperatures.size();
        vector<int> ans(n,0);
        stack<int> stk;
        for(int i=0;i<n;i++)
        {
            if(stk.empty())
            {
                stk.push(i);
                continue;
            }
            if(temperatures[stk.top()]>temperatures[i])
            {
                stk.push(i);
            }
            else
            {
                while(!stk.empty()&&temperatures[i]>temperatures[stk.top()])
                {
                    ans[stk.top()]=i-stk.top();
                    stk.pop();
                }
                stk.push(i);
            }
        }
        return ans;
    }
};

496下一个更大元素

同样是单调栈套皮,只是存的东西不一样了

class Solution {
public:
    vector<int> nextGreaterElement(vector<int>& nums1, vector<int>& nums2) {
        int n=nums1.size();
        int m=nums2.size();
        vector<int> temp(m,-1);
        vector<int> ans(n,0);
        stack<int> stk;
        for(int i=0;i<m;i++)
        {
            if(stk.empty())
            {
                stk.push(i);
                continue;
            }
            if(nums2[stk.top()]>nums2[i])
            {
                stk.push(i);
            }
            else
            {
                while(!stk.empty()&&nums2[stk.top()]<nums2[i])
                {
                    temp[stk.top()]=nums2[i];
                    stk.pop();
                }
                stk.push(i);
            }
        }
        unordered_map<int,int> mymap;
        for(int i=0;i<m;i++)
        {
            mymap.emplace(nums2[i],temp[i]);
        }
        for(int i=0;i<n;i++)
        {
            ans[i]=mymap[nums1[i]];
        }

        return ans;
    }
};

503下一个更大元素ii

两遍单调栈

class Solution {
public:
    vector<int> nextGreaterElements(vector<int>& nums) {
        int n=nums.size();
        vector<int> ans(n,-1);
        stack<int> stk;
        for(int i=0;i<n;i++)
        {
            if(stk.empty())
            {
                stk.push(i);
                continue;
            }
            if(nums[stk.top()]>nums[i])
            {
                stk.push(i);
            }
            else
            {
                while(!stk.empty()&&nums[stk.top()]<nums[i])
                {
                    ans[stk.top()]=nums[i];
                    stk.pop();
                }
                stk.push(i);
            }

        }
        for(int i=0;i<n;i++)
        {
            if(stk.empty())
            {
                stk.push(i);
                continue;
            }
            if(nums[stk.top()]>nums[i])
            {
                stk.push(i);
            }
            else
            {
                while(!stk.empty()&&nums[stk.top()]<nums[i])
                {
                    ans[stk.top()]=nums[i];
                    stk.pop();
                }
                stk.push(i);
            }

        }
        return ans;
    }
};

接雨水

经典题目,思路比较简单,但是实现上要注意许多细节

class Solution {
public:
    int trap(vector<int>& height) {
        int ans=0;
        int n=height.size();

        stack<int> stk;

        for(int i=0;i<n;i++)
        {
            if(stk.empty())
            {
                stk.push(i);
                continue;
            }
            if(height[stk.top()]>height[i])
            {
                stk.push(i);
            }
            else if(height[stk.top()]==height[i])
            {
                stk.pop();
                stk.push(i);
            }
            else
            {
                while(!stk.empty()&&height[stk.top()]<height[i])
                {
                    int mid=stk.top();
                    stk.pop();
                    if(!stk.empty())
                        ans+=(min(height[stk.top()],height[i])-height[mid])*(i-stk.top()-1);
                }
                stk.push(i);
            }
        }
        return ans;
    }
};
posted @ 2024-01-27 15:22  LiviaYu  阅读(8)  评论(0)    收藏  举报