leetcode84——柱状图的最大矩形
Posted dtwd886
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了leetcode84——柱状图的最大矩形相关的知识,希望对你有一定的参考价值。
单调栈的方法,每次弹出大于等于当前需要入栈的元素,且最后的栈是顺序递增的,需要将所有元素依次弹出,这个时候每个弹出的元素所对应的最大面积为index=stk.top(),stk.pop(),result_max=max(result_max,(len-stk.top()-1)*heights[index])
class Solution
public:
int largestRectangleArea(vector<int>& heights)
int len=heights.size();
stack<int>stk;
stk.push(-1);
int max_result=0;
for(int i=0;i<len;i++)
if(stk.top()==-1||heights[stk.top()]<heights[i])
stk.push(i);
else
while(stk.top()!=-1&&heights[stk.top()]>=heights[i])
int index=stk.top();
cout<<index<<" "<<endl;
stk.pop();
max_result=max(max_result,(i-stk.top()-1)*heights[index]);
stk.push(i);
cout<<stk.size()<<endl;
int index_temp=stk.top();
while(stk.top()!=-1)
int index=stk.top();
stk.pop();
//cout<<index<<" "<<index_temp<<" "<<stk.top()<<endl;
max_result=max(max_result,(len-stk.top()-1)*heights[index]);
//index_temp=index;
return max_result;
;
方法二:记录左右边界的方法
class Solution
public:
int largestRectangleArea(vector<int>& heights)
int len=heights.size();
int max_result=0;
vector<int>left;
vector<int>right(len,0);
stack<int>stk1;
stack<int>stk2;
stk1.push(-1);
stk2.push(len);
for(int i=0;i<len;i++)
while(stk1.top()!=-1&&heights[stk1.top()]>=heights[i])
stk1.pop();
left.push_back(stk1.top());
stk1.push(i);
for(int i=len-1;i>=0;i--)
while(stk2.top()!=len&&heights[stk2.top()]>=heights[i])
stk2.pop();
cout<<stk2.top()<<endl;
right[i]=stk2.top();
stk2.push(i);
for(int i=0;i<len;i++)
//cout<<left[i]<<" "<<right[i]<<endl;
max_result=max(max_result,(right[i]-left[i]-1)*heights[i]);
return max_result;
;
方法二的优化:一遍遍历
class Solution
public:
int largestRectangleArea(vector<int>& heights)
int len=heights.size();
int max_result=0;
vector<int>left;
vector<int>right(len,len);
stack<int>stk1;
stack<int>stk2;
stk1.push(-1);
stk2.push(len);
for(int i=0;i<len;i++)
while(stk1.top()!=-1&&heights[stk1.top()]>=heights[i])
right[stk1.top()]=i;
stk1.pop();
left.push_back(stk1.top());
stk1.push(i);
for(int i=len-1;i>=0;i--)
while(stk2.top()!=len&&heights[stk2.top()]>=heights[i])
stk2.pop();
cout<<stk2.top()<<endl;
right[i]=stk2.top();
stk2.push(i);
for(int i=0;i<len;i++)
//cout<<left[i]<<" "<<right[i]<<endl;
max_result=max(max_result,(right[i]-left[i]-1)*heights[i]);
return max_result;
;
以上是关于leetcode84——柱状图的最大矩形的主要内容,如果未能解决你的问题,请参考以下文章
LeetCode 84. 柱状图中最大的矩形 | Python