largest Rectangle in Histogram

解法一:brute force的方法很直接,就是对于每一个窗口,找到其中最低的高度,然后求面积,去其中最大的矩形面积。总共有n^2个窗口,找最低高度是O(n)的操作,所以复杂度是O(n^3)。

解法二:就是从每一个bar往两边走,以自己的高度为标准,直到两边低于自己的高度为止,然后用自己的高度乘以两边走的宽度得到矩阵面积。因为我们对于任意一个bar都计算了以自己为目标高度的最大矩阵,所以最好的结果一定会被取到。每次往两边走的复杂度是O(n),总共有n个bar,所以时间复杂度是O(n^2)。

最后的做法:使用stack

从左往右,我们将index加入stack中,当cur所对应的高度小于最后压入stack的index的高度时,我们可以开始计算stack中高度大于cur的高度的面积了,因为我们可以知道:压入stack中的值是一个递增序列此时高度大于cur的右边边际已经确定为cur之前的一个index。

此时对于某一index面积可以这样计算: 高度:height[stack.pop()];

宽度:cur - 1 - (stack.peek() + 1) + 1(stack.peek()得到的是pop()之后的值,即前一个值,因为前一个index到当前index之间bar的高度都是高于当前index的高度的)

经过这样一轮操作,stack中大于cur的高度的index全部被pop出stack,以他们为高度的所有面积也都计算过了。

results matching ""

    No results matching ""