关于单调栈解答最大直方图思考~

首先呢 是对于最大直方图的分析 n个数据 每个数据都有一个相对应的高的最大长方形~ 可以求出每个对应高的长方形的面积 然后对比得出最大值即可~而此时利用栈结构以实现单调栈的话~每遇到一个比栈顶元素高的就入栈 低的就将栈顶弹出并计算其对应的长方形面积~这样的话就可以实现对每个点对应高度的对应长方形的相应解法~~ 对于求其面积也很简单 弹出元素的高度 也就是height[弹出元素]*( i-(stack[新栈顶元素]))(---这里是height[弹出元素]所对应的宽度)与ans 最大值想比较即可 其实现代码如下; //请问 从哪里可以看出此单调栈可以将节点全部遍历~ :由于每次无论while循环是否被执行 push操作均进行~所以for循环内遍历的各点均会被入栈一次;而对于出栈操作 由于有效节点(也就是非0 高度)节点均满足高度大于哨兵节点 所以无论如何均会被计算一次对应高度的最大长方形面积~ 所以此方法可行~复杂度近似O(n)

stack s; int ans =0
s.push(0);

for(int i=1;i<=n+1;i++){//前后设立哨兵节点
while(height[s.top()]>height[i]){
 int tem = s.top();
   s.pop();
  ans =max(ans,(i-s.top()-1)*height[tem])
}
s.push[i];
}

以上是单调栈版本 我们也可以用蛮力法遍历

int getAnswer(){
for(int i =1;i<=n;i++){
//对于节点i 分别找到其左右哨兵节点
//左
for(int  lo=i-1;lo>=1;lo--)
 if(height[lo]<height[])break;

//右
for(int hi=i+1;hi<=n;hi++)break;
ans=max(ans,(hi-l0-1)*height[i]);
}
return ans;
}

然后我们对其进行二维扩展
题目是最大红矩阵面积问题
就是 n行m列元素只有绿色(X)
或者红色(.) 求在这n行m列中红矩阵的面积的最大值。

思路 在这里我们不妨借助上述的最大直方图面积 ,将每一行看作一次最大直方图的求值。
遍历n行 即可求出最大红矩阵的面积() 由于单调栈的时间复杂度是O(n)所以如果要使用单调栈解决最大红矩阵问题的话时间复杂度是O(n^2);而此思路的关键则是求出每一行所对应的各列元素的高。 (思路用一维矩阵 height维护 若其对应行所对应的列向量是.(红色)则height[j]++否则置0.)
大致代码如下:

stack s;

for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(matrix[i][j]==',')height[j]++;else height[j]=0;

while(!s.empty())s.pop();//清空栈
s.push(0)//哨兵元素
 for(int j =1;i<=m+1;j++){
     while(height[j]<height[s.top()]){
     int now_h =height[s.top()];s.pop();
     ans=max(ans,now_h*(j-s.top()-1));
     }
s.push(j);
}
return ans ;
}
}

附加读写挂之一(暂存)

请输入代码

hhhhhh
1 声望0 粉丝