LeetCode 84柱状图中最大的矩形 | 代码随想录25期训练营day60 完结撒花!
2023-12-26 15:28:48
单调栈3
LeetCode 84 柱状图中最大的矩形 2023.12.23
int largestRectangleArea(vector<int>& heights) {
/*
//双指针法,也是暴力求解的
//result存储最终答案,即勾勒出来的矩形最大面积
int result = 0;
//minleft、minright数组分别记录索引i左侧或右侧第一个比height[i]小的值的索引
//minleft[0]需要初始化为-1,其他值会被覆盖
//minright[heights.size()-1]需要初始化为heights.size(),其他值会被覆盖
vector<int> minleft(heights.size(), -1);
vector<int> minright(heights.size(), heights.size());
for (int i = 1; i < heights.size(); i++)
{
//用temp变量记录左侧第一个比height[i]小的值的索引
int temp = i-1;
while (temp >= 0 && heights[temp] >= heights[i])
temp = minleft[temp];
//将temp存入数组中,记录为当前索引值对应的左侧第一个比其小的数的索引
minleft[i] = temp;
}
for (int i = heights.size()-2; i >= 0; i--)
{
//用temp变量记录右侧第一个比height[i]小的值的索引
int temp = i+1;
while (temp < heights.size() && heights[temp] >= heights[i])
temp = minright[temp];
//将temp存入数组中,记录为当前索引值对应的右侧第一个比其小的数的索引
minright[i] = temp;
}
//遍历求解最大矩形面积
for (int i = 0; i < heights.size(); i++)
{
//宽
int l = minright[i] - minleft[i] - 1;
//高
int h = heights[i];
//更新result为遍历最大值
result = result < l*h ? l*h : result;
}
return result;
*/
//单调栈法
//result存储最终答案,即勾勒出来的矩形最大面积
int result = 0;
//数组头部加入元素0,为了保证前两个柱体可能为最大解
heights.insert(heights.begin(), 0);
//数组尾部加入元素0,为了保证后两个柱体可能为最大解
heights.push_back(0);
//创建单调栈存储已经遍历过的元素的索引,且该栈元素呈单调递减
stack<int> st;
st.push(0);
for (int i = 1; i < heights.size(); i++)
{
//当前柱高大于栈顶索引对应的柱高,因为提前已经头部加入0所以栈内一定元素大>=2
while (heights[st.top()] > heights[i])
{
//heights[i]<height[st.top()],栈的下一个索引对应值也小于height[st.top()]
int mid = st.top();
st.pop();
int l = i - st.top() - 1;//宽
int h = heights[mid];//此时的极大值,高
//更新result为遍历最大值
result = result < l*h ? l*h : result;
}
st.push(i);
}
return result;
}
文章来源:https://blog.csdn.net/weixin_66706867/article/details/135170740
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!