LeetCode:85. 最大矩形
題目鏈接
85. 最大矩形
題目描述
給定一個(gè)僅包含?0 和 1 的二維二進(jìn)制矩陣,找出只包含 1 的最大矩形,并返回其面積。
示例:
輸入: [["1","0","1","0","0"],["1","0","1","1","1"],["1","1","1","1","1"],["1","0","0","1","0"] ] 輸出: 6解題思路
第一步
我們把矩形橫向定義為長(zhǎng),縱向定義為寬。
計(jì)算出每一點(diǎn)向右畫(huà),最遠(yuǎn)能畫(huà)到多少。
換句話說(shuō),我們求出每一點(diǎn)寬為1的時(shí)候,長(zhǎng)最大是多少。
例如對(duì)于樣例中的輸入,我們的計(jì)算結(jié)果是
1 0 1 0 0?
1 0 3 2 1?
5 4 3 2 1?
1 0 0 1 0?
再給一個(gè)樣例
{{'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'}}
對(duì)于這個(gè)樣例,我們的計(jì)算結(jié)果是
8 7 6 5 4 3 2 1?
7 6 5 4 3 2 1 0?
7 6 5 4 3 2 1 0?
5 4 3 2 1 0 0 0?
0 4 3 2 1 0 0 0?
第二步
根據(jù)第一步計(jì)算結(jié)果計(jì)算最大矩形。
這里面有一個(gè)木桶原理,木桶能裝多少水,取決于木桶的最短板。
對(duì)于每一個(gè)點(diǎn),我們只考慮向右和向下的方向。第一步計(jì)算出了向右方向——最大的長(zhǎng)。
接下來(lái),我們開(kāi)始向下擴(kuò)展,每向下擴(kuò)展一行,寬就要+1,長(zhǎng)就會(huì)變成擴(kuò)展的k行里面的最小值,面積就要?jiǎng)討B(tài)變化,這樣就可以找到每個(gè)點(diǎn)的面積最大值。
最后再找到全局最大值。
解題代碼
class Solution {public int maximalRectangle(char[][] matrix) {int m = matrix.length;if (m == 0) {return 0;}int n = matrix[0].length;int[][] l = new int[m][n];for (int i = 0; i < m; i++) {for (int j = 0; j < n; j++) {if (matrix[i][j] == '0') {l[i][j] = 0;continue;}int index = j + 1;while (index < n && matrix[i][index] == '1') {index++;}l[i][j] = index - j;}}int maxS = 0;for (int i = 0; i < m; i++) {for (int j = 0; j < n; j++) {//遍歷每個(gè)點(diǎn),以該點(diǎn)為左上角if (l[i][j] == 0) {continue;}int s = l[i][j];for (int k = 1; k < m - i && matrix[i + k][j] != '0'; k++) {int minL = l[i][j];// 找到 由i到i+k的最小值for (int t = i + 1; t <= i + k; t++) {if (minL >= l[t][j]) {minL = l[t][j];}}//當(dāng)前點(diǎn)為左上角,面積所能達(dá)到的最大值s = Math.max((k + 1) * minL, s);}maxS = Math.max(maxS, s);}}return maxS;}}測(cè)試代碼
public static void main(String[] args) {Solution s = new Solution();char[][] b = { { '1', '0', '1', '0', '0' }, { '1', '0', '1', '1', '1' },{ '1', '1', '1', '1', '1' },{ '1', '0', '0', '1', '0' } };char[][] b1 = { { '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' } };System.out.println(s.maximalRectangle(b1));System.out.println(s.maximalRectangle(b));}?測(cè)試結(jié)果:
21
6
解題結(jié)果
| 66 / 66?個(gè)通過(guò)測(cè)試用例 | 狀態(tài): 通過(guò) |
| 執(zhí)行用時(shí):42 ms |
總結(jié)
以上是生活随笔為你收集整理的LeetCode:85. 最大矩形的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: LeetCode:64. 最小路径和
- 下一篇: 软件工程专业学生如何在研二期间通过六级—