C++ 直方图中的最大矩形

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

我正在研究下面的算法难题,下面是详细的问题陈述

找到直方图的最大矩形;例如,给定直方图=[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 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吗?