leetcode : Maximal Rectangle & Maximum Subarray & Largest Rectangle in Histogram

1, Maximum Subarray

大致就是给一个int型数组,求一个长度最小为1的子数组,使得里面的数加起来和最大。

很经典的dp题,方法是对于每一个i,求出以i结尾的最大子数组。而求以i 为结尾的最大子数组的问题可以变成,求以i - 1为结尾的最大子数组的值max_(i - 1),然后比较i 与max_(i - 1)中较大者。AC代码忽略~时间复杂度为O(n)

2,Maximal Rectangle I

给一个矩阵,求面积最小为1的子矩阵,使得里面的数加起来最大

将问题转化。假设它是m * n的矩阵,那么可以分别求开始于第i行,结束于第j行的矩阵的最大和。

这个问题就可以把每一列中的第i个数到第j个数的和求出来,放到一个数组里,然后变成问题1.

所以需要的时间复杂度为 

O(  m * n + (m-1) * n + ... n ) = O(m^2 * n )    //求所有开始于第i行,并结束于i, i+1...m的矩阵的复杂度为 2(m -  i) * n  (一次加法求列和,一次dp求最大子数组)

 

3,Largest Rectangle in Histogram

求直方图的连续最大面积

从暴力求解的优化思路有两个,第一,假如某次计算以j为右边界,并且value[j+1]大于j,那么拿j + 1当右边界肯定比j好,即最大值绝对不会以j为右边界

而左边界呢,选个目前为止遇见的最小的就ok~

所以就是方法就是这样的

维护一个栈,

对于每一个项i,如果栈空则进栈,如果栈不空则比较,如果它比栈顶元素大则进栈,否则将栈中最大元素为右边界,分别以比该项大的每个元素作为左边界算面积。算完再把该项入栈。

最后要额外把0入栈~把以最小元素为左边界的那些面积给算了

这样做比起暴力求解的优化 就是对于那些不可能成为最大值的右边界 全部滤掉了~并且只比较了n次大小(因为将连续递增的项都存起来了~~~)

因为每个元素只会出栈一次,所以复杂度还是O(n)

4 Maximal Rectangle II

这次是给个由 1或 0 组成的矩阵,求全部由1组成的面积最大的矩形

这个问题很像问题1,类似的转换思想,只不过子问题变成了问题3。

分别求从第i行到下面所有行的最大矩阵,用一个数组维护直方图的高度,遇见0就置0,遇见1就自增一次,

每一行都要自增一次然后再求一次问题3.所以时间复杂度为

m * 2m * n + (m - 1) * 2m * n .. +2m * n = O(m^2 *n)

 

其实写算法题的时候,最好先思量一下暴力求解复杂度大概为多少,优化之后达到多少就可以了,暴力求解有哪些操作是可以优化掉的

关键字比较算法从n^2 到快排的n *logn 就已经到达极限了的说

posted on 2014-12-07 22:51  远近闻名的学渣  阅读(139)  评论(0)    收藏  举报

导航