[leetcode] Maximal Rectangle | 0101组成的矩阵,求里面全是1的矩形的最大面积
Posted October 19, 2013
on:- In: leetcode
- 4 Comments
这个题挺吓人的,后来bf给讲明白了然后记得葫芦半片的,今天自己重新想了想,还是做出来了也通过了。不过是O(M * M * N的速度,没有网上说的O(M*N),忍了,反正也能pass oj.
算法:
- 先用dp求一个新矩阵,d[i][j]表示以(i, j)结尾有几个连续1(在当前row)。
- 然后遍历这个新矩阵,在每个cell,都看看“宽度是d[i][j]的矩阵最多能有多高?“,也就是往上expand到宽度变窄为止,往下expand到宽度变窄为止,然后总高度×当前宽度就是d[i][j]所属于的矩阵的最大面积。这就是个O(M * N) * O(M)。
当时给讲的时候觉得这怎么是人类能想出来的呢?然后bf说你把二维降成一维怎么做,不也是找以当前结束的1有多长吗。然后恍然大悟,这题还是有救的。题目本身写起来细节不多,不容易出bug,两遍就过了很开心~
public int maximalRectangle(char[][] matrix) { if (matrix.length == 0) return 0; int res = 0; int m = matrix.length, n = matrix[0].length; int[][] d = new int[m][n]; for (int i = 0; i < m; i++) { d[i][0] = matrix[i][0] - '0'; for (int j = 1; j < n; j++) { d[i][j] = matrix[i][j] == '1' ? d[i][j - 1] + 1 : 0; } } for (int i = 0; i < m; i++) { for (int j = 0; j < n; j++) { res = Math.max(res, expand(d, i, j)); } } return res; } private int expand(int[][] d, int I, int J) { int height = 0; int width = d[I][J]; //go up for (int i = I - 1; i >= 0; i--) { if (d[i][J] >= width) { height++; } else { break; } } //go down for (int i = I; i < d.length; i++) { if (d[i][J] >= width) { height++; } else { break; } } return width * height; }
4 Responses to "[leetcode] Maximal Rectangle | 0101组成的矩阵,求里面全是1的矩形的最大面积"

记得当时上算法课 有一道作业题是先处理再dp 当时这题基本上做了两周 因为根本想不到预处理的过程 没记错的话是连着去了3个office hour 直到due前的最后一个office hour老师才给了先预处理再dp的提示 感觉这道题和那个题有异曲同工之妙 需要先dp 再处理. PS0: 妈蛋根本想不到啊摔 PS1: 那道题是Algorithm Design (KT Book) Chapter 6 Exercise 6 PS2: 感谢博主的solution PS3: 决定把代码扔在github上


Awesome solution! The idea is very clear and intuitive!

April 4, 2014 at 4:04 pm
写得好,