代码随想录——单调栈习题合集

这篇文章包含一系列数组处理算法,如计算每日温度中需要等待多少天才能达到更高温度,寻找数组中的下一个更大元素,以及求解接雨水问题和柱状图中最大的矩形面积。这些算法都涉及栈数据结构和数组遍历,旨在解决数值序列中的比较和查找问题。
摘要由CSDN通过智能技术生成

739. 每日温度

vector<int> dailyTemperatures(vector<int>& temperatures) {
        vector<int> res;
        int stk[temperatures.size()+1],tt=0;
        for(int i=temperatures.size()-1;i>=0;i--){
            while(tt&&temperatures[stk[tt]]<=temperatures[i]) tt--;
            if(tt) res.push_back(stk[tt]);
            else res.push_back(0);
            stk[++tt]=i;
        }
      
        reverse(res.begin(),res.end());
        for(int i=0;i<temperatures.size();i++) if(res[i]!=0) res[i]=res[i]-i;
        return res;
    }

496. 下一个更大元素 I

 vector<int> nextGreaterElement(vector<int>& nums1, vector<int>& nums2) {
        unordered_map<int,int> map;
        int stk[nums2.size()+1],tt=0;
        vector<int> res;
        for(int i=nums2.size()-1;i>=0;i--){
            while(tt&&stk[tt]<=nums2[i]) tt--;
            if(tt) map[nums2[i]]=stk[tt];
            else map[nums2[i]]=-1;
            stk[++tt]=nums2[i];
        }
        for(int i=0;i<nums1.size();i++)    res.push_back(map[nums1[i]]);
        return res;
        
    }

 503. 下一个更大元素 II

 vector<int> nextGreaterElements(vector<int>& nums) {
        int n=nums.size(); 
        vector<int> res;
        int stk[n+1],tt=0;
        for(int i=0;i<n;i++) nums.push_back(nums[i]);

        for(int i=nums.size()-1;i>=0;i--){
            while(tt&&stk[tt]<=nums[i]) tt--;
            if(tt) res.push_back(stk[tt]);
            else res.push_back(-1);
            stk[++tt]=nums[i];
        }
        reverse(res.begin(),res.end());
        return vector<int>(res.begin(),res.begin()+n);
    }

42. 接雨水

 int trap(vector<int>& height) {
        int res=0;
        vector<int>lheight(height.size(),0);
        vector<int>rheight(height.size(),0);
        lheight[0]=height[0],rheight[height.size()-1]=height[height.size()-1];

        for(int i=1;i<height.size();i++){
            lheight[i]=max(height[i],lheight[i-1]);
        }
        for(int i=height.size()-2;i>=0;i--){
            rheight[i]=max(height[i],rheight[i+1]);
        }
        for(int i=0;i<height.size();i++){
            res+=min(rheight[i],lheight[i])-height[i];
        }
        return res;
    }

 84. 柱状图中最大的矩形

int largestRectangleArea(vector<int>& heights) {
        int res=0;
        vector<int> lheight(heights.size()+1,0);
        vector<int> rheight(heights.size()+1,0);
        lheight[0]=-1;rheight[heights.size()-1]=heights.size();
       
        for(int i=1;i<heights.size();i++){
            int t=i-1;
            while(t>=0&&heights[t]>=heights[i]) t=lheight[t];
            lheight[i]=t;  
        }
        for(int i=heights.size()-2;i>=0;i--){
            int t=i+1;
            while(t<heights.size()&&heights[t]>=heights[i]) t=rheight[t];
            rheight[i]=t;  
        }
        for(int i=0;i<heights.size();i++){
            int s=heights[i]*(rheight[i]-lheight[i]-1);
            res=max(res,s);
        }
        return res;
    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值