C++算法:柱状图中最大的矩形
  Gjs2egXd7m0h 2023年11月02日 77 0


##题目

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

其它

视频课程

如果你觉得复杂,想从简单的算法开始,可以学习我的视频课程。

我的其它课程

测试环境

win7 VS2019 C++17

相关下载

doc版文档,排版好


【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

推荐阅读
  8Tw5Riv1mGFK   2024年05月01日   81   0   0 C++
  BYaHC1OPAeY4   2024年05月08日   58   0   0 C++
  yZdUbUDB8h5t   2024年04月29日   59   0   0 C++
  yZdUbUDB8h5t   2024年05月05日   44   0   0 C++
  oXKBKZoQY2lx   2024年05月17日   60   0   0 C++
Gjs2egXd7m0h