1. 程式人生 > 實用技巧 >LeetCode 85. 最大矩形

LeetCode 85. 最大矩形

題目連結

85. 最大矩形

題目分析

這個題和最大正方形有點類似,但是這個是個矩形,所以需要特殊手段來求,但是總體來說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;
    }
}