一面木板墙,每块木板的宽度都是 1,现在想在木板墙上沿着平行于地面的方向切割出一块矩形区域。
如果知道每块木板的高度,如何切出的矩形面积最大?木板墙如下图所示:
图中有 7 块木板,每块木板的高度分别为:2、4、4、3、5、1、1。
尝试后,我们发现最大的矩形就是波浪图案部分所示。
也就是切割了高度为 4、4、3、5 四块木板,形成了一个高度为 3,宽度为 4 的矩形,这个最大面积为 12。
经过尝试,可以发现:切下来的最大矩形,一定是以最大矩形所在的区域中最短的那块木板为矩形的高度值。
这样我们可以枚举每一块木板,每次都以当前木板作为高度。
就是把当前木板当成是切出来的矩形区域中最矮的木板,然后分别向左右延伸,切出此时的最大矩形区域。
当把所有的木板都尝试过一遍后,我们在所有的结果中比较出最大值,这个最大值就是我们要求的最大矩形面积。
如果木板的数量为 n,那么这种算法的时间复杂度接近于 O(n^2)。
但是,如果利用好栈这种数据结构,就能快速的定位左右延伸的最远位置,将算法的时间复杂的降低到 O(n)。