LeetCode 85. 最大矩形
阿新 • • 發佈:2020-09-14
題目連結
題目分析
這個題和最大正方形有點類似,但是這個是個矩形,所以需要特殊手段來求,但是總體來說dp的思路是沒問題的。
我們開一個三維陣列dp[i][j][k], i代表第i行,j代表列,k代表兩個方向上1的個數。
dp[i][j][0] 就是matrix[i][j]水平方向累計多少個連續1, dp[i][j][1]就是matrix[i][j]豎直方向累計多少個1。
這裡為了方便計算,我們dp陣列的i,j進行加1的偏移。
我們每遍歷到1的時候,都需要對以matrix[i][j]為右下角的矩形進行面積的計算。
在計算的時候我們動態更新下當前矩形最高的高度,因為矩形高度取決於最短的那個。
具體看程式碼吧。
程式碼實現
class Solution { public int maximalRectangle(char[][] matrix) { if(matrix.length == 0){ return 0; } int[][][] dp = new int[matrix.length + 1][matrix[0].length + 1][2]; int max = 0; for(int i = 1; i <= matrix.length; i++){ for(int j = 1; j <= matrix[i - 1].length; j++){ if(matrix[i-1][j-1] == '1'){ dp[i][j][0] = dp[i][j-1][0] + 1; dp[i][j][1] = dp[i-1][j][1] + 1; int idx = dp[i][j][0]; int high = Integer.MAX_VALUE; for(int k = 1; k <= idx; k++){ high = Math.min(high, dp[i][j - k + 1][1]); max = Math.max(max, k * high); } } } } return max; } }