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;
}
};