C++ 直方图中的最大矩形
我正在研究下面的算法难题,下面是详细的问题陈述 找到直方图的最大矩形;例如,给定直方图=[2,1,5,6,2,3],算法应返回10 我正在编写以下版本的代码。我的问题是,我认为C++ 直方图中的最大矩形,c++,algorithm,C++,Algorithm,我正在研究下面的算法难题,下面是详细的问题陈述 找到直方图的最大矩形;例如,给定直方图=[2,1,5,6,2,3],算法应返回10 我正在编写以下版本的代码。我的问题是,我认为I-nextTop-1可以被I-top取代,但是在一些测试用例中(例如[2,1,2]),它们有不同的结果(I-nextTop-1总是产生正确的结果)。我认为逻辑上它们应该是相同的,我想知道在什么情况下I-nextTop-1不等于I-top class Solution { public: int largest
I-nextTop-1
可以被I-top
取代,但是在一些测试用例中(例如[2,1,2]),它们有不同的结果(I-nextTop-1
总是产生正确的结果)。我认为逻辑上它们应该是相同的,我想知道在什么情况下I-nextTop-1
不等于I-top
class Solution {
public:
int largestRectangleArea(vector<int>& height) {
height.push_back(0);
int result=0;
stack<int> indexStack;
for(int i=0;i<height.size();i++){
while(!indexStack.empty()&&height[i]<height[indexStack.top()]){
int top=indexStack.top();
indexStack.pop();
int nextTop=indexStack.size()==0?-1:indexStack.top();
result=max((i-nextTop-1)*height[top],result);
}
indexStack.push(i);
}
return result;
}
};
类解决方案{
公众:
int最大矩形区域(向量和高度){
高度。推回(0);
int结果=0;
堆栈索引;
对于(int i=0;i发生i-nextTop-1!=i-top
的情况,如下所示:
nextTop != top-1
这可以通过简单地重新排列不等式i-nextTop-1!=i-top
中的项来看出
理解何时发生这种情况的关键在于代码中的以下行,其中定义了nextTop
的值:
int nextTop = indexStack.size() == 0 ? -1 : indexStack.top();
这里,您的意思是如果indexStack
为空(在前一行代码的pop()
之后),则将nextTop
设置为-1
;否则将nextTop
设置为当前indexStack.top()
因此,只有当nextTop==top-1
时
indexStack
为空且top==0
,或
indexStack.top()==top-1
在这些情况下,这两种方法总是一致的。在所有其他情况下,它们不会一致,并且会产生不同的结果
通过打印i
,nextTop
,(i-top)
,(i-nextTop-1)
,以及result
的值,您可以看到在while
循环底部的每个迭代发生了什么。向量{5,4,3,2,1}
工作正常,但{1,2,3,4,5}
用i-top
替换i-nextTop-1
时,不会出现这种情况。
算法原理
外部for
循环一次遍历一个直方图元素。元素从左到右推送到堆栈上,当进入循环时,堆栈顶部包含当前元素之前(或左侧)的元素。(这是因为当前元素被推到for
循环底部的堆栈上,就在循环返回顶部之前。)
当算法确定已考虑包含该元素的最佳可能解决方案时,将在while
循环中弹出一个元素
只要height[i]
,即只要当前元素的高度小于堆栈顶部元素的高度,内部while
循环就会继续迭代
在while
循环的每次迭代开始时,堆栈上的元素表示当前元素最左边的所有连续元素,这些元素大于当前元素
这允许算法计算当前元素左侧最大矩形的面积,包括当前元素。此计算在以下两行代码中完成:
int nextTop = indexStack.size() == 0 ? -1 : indexStack.top();
result = max((i - nextTop - 1) * height[top], result);
变量i
是当前直方图元素的索引,表示当前正在计算的矩形的最右边缘
变量nextTop
表示矩形最左边边的索引
表达式(i-nextTop-1)
表示矩形的水平宽度。height[top]
是矩形的垂直高度,因此结果是这两个术语的乘积
每个新的结果
都是新计算值和结果
的先前值中的较大值。感谢sifferman,i-nextTop-1
的逻辑含义是什么?表达式(i-nextTop-1)
表示矩形的水平宽度。我在回答中添加了一个理论部分,解释了算法。谢谢sifferman,回答得很好,并将其标记为已回答。:)这是在线谜题吗?你能提供url吗?