日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

LeetCode:85. 最大矩形

發(fā)布時(shí)間:2025/3/19 编程问答 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 LeetCode:85. 最大矩形 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

題目鏈接

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)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。