求图片中矩形最大的面积,类似于桶的容量由最短的木板决定的,见图片。
矩形的高度可以用数组表示,同时这个场景可以和另外一个场景联系起来:给定一个二维矩阵,矩阵中的元素只有0和1,求一个最大的子矩阵(要求子矩阵中的元素全是1) ,最大指的是矩阵中的1的数量最多。
下图中的矩阵 a 只包含1和0:
[1, 1, 1, 1, 1, 1, 1, 1]
[1, 1, 1, 1, 1, 1, 1, 0]
[1, 1, 1, 1, 1, 1, 1, 0]
[1, 1, 1, 1, 1, 0, 0, 0]
[0, 1, 1, 1, 1, 0, 0, 0]
我们需要按照a矩阵来构造一个同样大小的矩阵 b:
[4, 5, 5, 5, 5, 3, 3, 1]
[3, 4, 4, 4, 4, 2, 2, 0]
[2, 3, 3, 3, 3, 1, 1, 0]
[1, 2, 2, 2, 2, 0, 0, 0]
[0, 1, 1, 1, 1, 0, 0, 0]
怎么构造的呢? 对于b中的任意一个元素b[i][j] 就是a中同样位置元素a[i][j] 的j列往“下”有多少连续个1,
完成b矩阵构造之后,就回到上面这个图了,我们以b中每一行为边去构造矩形,记录这个过程中产生的最大值,就是我们要求的答案了。
例如 [4, 5, 5, 5, 5, 3, 3, 1] 依次表示了矩形的高度,同时每个矩形的宽度都是1。使用单调栈来完成。
代码如下: