C++算法:84柱状图中最大的矩形

文章介绍了如何使用单调栈解决LeetCode84题中的柱状图最大矩形面积问题,给出了两种C++实现方法,包括基于栈的迭代和维护左右边界的方法。
摘要由CSDN通过智能技术生成

LeetCode84柱状图中最大的矩形

给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。
求在该柱状图中,能够勾勒出来的矩形的最大面积。
示例 1:
输入:heights = [2,1,5,6,2,3]
输出:10
解释:最大的矩形为图中红色区域,面积为 10
示例 2:
输入: heights = [2,4]
输出: 4

分析

可以用单调栈解决。

23年3月

class Solution {
public:
int largestRectangleArea(vector& heights) {
m_c = heights.size();
vector vMaxLeft;
{
vector<std::pair<int, int>> vLeft;
for (int i = 0; i < heights.size(); i++)
{
const int& h = heights[i];
const int iLessNum = std::lower_bound(vLeft.begin(), vLeft.end(), h, [](const std::pair<int, int>& p, const int i)
{
return p.first < i;
}) - vLeft.begin();
if (0 == iLessNum)
{
vMaxLeft.push_back(-1);
}
else
{
vMaxLeft.push_back(vLeft[iLessNum - 1].second);
}
while (vLeft.size() && (vLeft.back().first >= h))
{
vLeft.pop_back();
}
vLeft.emplace_back(h, i);
}
}

	 int iMax = INT_MIN;
	 {
		 vector<std::pair<int, int>> vRight;
		 for (int i = m_c - 1; i >= 0; i--)
		 {
			 const int& h = heights[i];
			 
			 const int iLessNum = std::lower_bound(vRight.begin(), vRight.end(), h+1, [](const std::pair<int, int>& p, const int i)
			 {
				 return  p.first < i;
			 }) - vRight.begin();
			 if (0 == iLessNum)
			 {
				 iMax =max(iMax, h * (m_c -  vMaxLeft[i]-1));
			 }

			 else
			 {
				 const int iRight = vRight[iLessNum - 1].second;
				 iMax = max(iMax, h * (iRight - vMaxLeft[i]-1));
			 }
			 while (vRight.size() && (vRight.back().first >= h))
			 {
				 vRight.pop_back();
			 }
			 vRight.emplace_back(h, i);
		 }
	 }

	 return iMax;
 }
 int m_c;

};

23年8月

class Solution {
public:
int largestRectangleArea(vector& heights) {
m_c = heights.size();
vector vLeft(m_c, -1), vRight(m_c, m_c);
stack sta;
for (int i = 0; i < heights.size(); i++)
{
while (sta.size() && (heights[i] <= heights[sta.top()] ))
{
vRight[sta.top()] = i;
sta.pop();
}
if (sta.size())
{
vLeft[i] = sta.top();
}
sta.emplace(i);
}

	int iRet = 0;
	for (int i = 0; i < m_c; i++)
	{
		iRet = max(iRet, (vRight[i] - vLeft[i] - 1) * heights[i]);
	}
	return iRet;
}
int m_c;

};

其它

视频课程

如果你觉得复杂,想从简单的算法开始,可以学习我的视频课程。
https://edu.csdn.net/course/detail/38771

我的其它课程
https://edu.csdn.net/lecturer/6176

测试环境

win7 VS2019 C++17

相关下载

doc版文档,排版好
https://download.csdn.net/download/he_zhidan/88348653

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

闻缺陷则喜何志丹

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值