剑指 Offer II 栈

036. 后缀表达式

class Solution {
   Stack<Integer>nums=new Stack<Integer>();
    public int evalRPN(String[] tokens) {
        for(String x: tokens)
        {
            char k=x.charAt(0);
            if(x.equals("+")||x.equals("-")||x.equals("*")||x.equals("/"))
            {
                int b=nums.pop(),a=nums.pop();
              if(x.equals("+"))a+=b;
             if(x.equals("-"))a-=b;
              if(x.equals("*"))a*=b;
               if(x.equals("/"))a/=b;
               nums.push(a);
            }
            else nums.push(Integer.parseInt(x));          
        }
        return nums.pop();
    }
}

037. 小行星碰撞

 vector<int> asteroidCollision(vector<int>& asteroids) {
        vector<int>res;
        for(int x:asteroids)
        {
            if(x>0)res.push_back(x);//往右飞等待比较 往左飞才比
            else
            {
                while(res.size()&&res.back()>0&&res.back()<-x)res.pop_back();
                if(res.size()&&res.back()==-x)res.pop_back();
                else if (res.empty()||res.back()<0)res.push_back(x);
            }
        }

        return res;

    }

038. 每日温度 单调栈模板题 背

class Solution {
    单调栈 从后往前进 找遍历顺序前面第一个比我大的数 
    如果我比它们大或等于 那答案肯定我优先 把它们弹出 
    public int[] dailyTemperatures(int[] temperatures) {
        int n=temperatures.length;

         int []stk =new int [n+1];
        int ans[]=new int [n];
        int tt=0;
        for(int i=n-1;i>=0;i--)
        {
            int x=temperatures[i];
           while(tt!=0&&x>=temperatures[stk[tt]])tt--;
            if(tt!=0)ans[i]=stk[tt]-i;
            stk[++tt]=i;
           
        }
        return ans;
    }
}

039. 直方图最大矩形面积 单调栈模板题 背

int largestRectangleArea(vector<int>& h) {
      
         h.push_back(0);//加一个最矮的 防止剩余矩形  保证都弹出来
        int n=h.size(),ans=0;  
        vector<int>s(n+1,0);//数组实现栈 
        vector<int>w(n+1,0);//维护宽度
        int p=0;//栈指针
        for(int i=0;i<=n-1;i++)
        {
            int x=h[i];
            if(s[p]<x)
            {
                s[++p]=x;
                w[p]=1;
            }
            else{
                int width=0;
                while(x<s[p])
                {
                    width+=w[p];
                    ans=max(ans,width*s[p]);
                    p--;
                }
                s[++p]=x;
                w[p]=width+1;//维护
            }
        }
        return ans;
    }

040. 矩阵中最大的矩形 难

class Solution {
public:
/*
粘上一题模板
枚举每一行 它上面最多有多少个连续个1 转化成了上一题
*/
 int largestRectangleArea(vector<int>& h) { 
         h.push_back(0);//加一个最矮的 防止剩余矩形  保证都弹出来
        int n=h.size(),ans=0;  
        vector<int>s(n+1,0);//数组实现栈 
        vector<int>w(n+1,0);//维护宽度
        int p=0;//栈指针
        for(int i=0;i<=n-1;i++)
        {
            int x=h[i];
            if(s[p]<x)
            {
                s[++p]=x;
                w[p]=1;
            }
            else{
                int width=0;
                while(x<s[p])
                {
                    width+=w[p];
                    ans=max(ans,width*s[p]);
                    p--;
                }
                s[++p]=x;
                w[p]=width+1;//维护
            }
        }
        return ans;
    }
    
    int maximalRectangle(vector<string>& matrix) {
        if(matrix.empty()||matrix[0].empty())return 0;
        int n=matrix.size(),m=matrix[0].size();
        vector<vector<int>>f(n,vector<int>(m));
        for(int i=0;i<n;i++)
        {
            for(int j=0;j<m;j++)
            {
               if(matrix[i][j]=='1')
               {
                   if(i)f[i][j]=1+f[i-1][j];
                   else f[i][j]=1;
               }
            }
        }
        int res=0;
        for(int i=0;i<n;i++)res=max(res,largestRectangleArea(f[i]));
        return res;
    }
};
posted @ 2022-03-04 22:09  liv_vil  阅读(22)  评论(0)    收藏  举报