每日一題——最大矩形

菜雞每日一題系列打卡85

每天一道算法題目 

小夥伴們一起留言打卡

堅持就是勝利,我們一起努力!

題目描述(引自LeetCode)

給定一個僅包含0和1的二維二進制矩陣,找出只包含1的最大矩形,並返回其面積。

示例:
輸入:
[
  ["1","0","1","0","0"],
  ["1","0","1","1","1"],
  ["1","1","1","1","1"],
  ["1","0","0","1","0"]
]
輸出: 6

題目分析

這是一道典型的動態規劃題目,在思考狀態轉移方程之前,首先需要明確,局部最大矩形可通過如下方式構建:

  • 不斷向上方遍歷,直到遇到“0”,以此找到矩形的最大高度。

  • 向左右兩邊擴展,直到無法容納矩形最大高度。

最大矩形就是局部最大矩形中最大的一個。

要獲得最大矩形,我們需要申請三個數組,分別維護矩形的高、矩形寬的左邊界、矩形寬的右邊界,然後根據矩形面積公式,求取當前矩形的面積,並適時更新結果。

代碼實現

class Solution {


    public int maximalRectangle(char[][] matrix) {
        if(matrix == null || matrix.length == 0) return 0;
        int row = matrix.length;
        int column = matrix[0].length;


        int[] left = new int[column];
        int[] right = new int[column];
        int[] height = new int[column];
        Arrays.fill(right, column);


        int result = 0;
        for(char[] c : matrix) {
            int lTmp = 0, rTmp = column;
            for(int i = 0; i < column; i++) {
                if(c[i] == '1') {
                    height[i]++;
                    left[i] = Math.max(left[i], lTmp);
                } else {
                    height[i] = 0;
                    left[i] = 0;
                    lTmp = i + 1;
                }
            }
            for(int i = column - 1; i >= 0; i--) {
                if(c[i] == '1') right[i] = Math.min(right[i], rTmp);
                else {
                    right[i] = column;
                    rTmp = i;
                }
            }
            for(int i = 0; i < column; i++) {
                result = Math.max(result, (right[i] - left[i]) * height[i]);
            }
        }
        return result;
    }


}

代碼分析

對代碼進行分析,不妨設matrix的行數爲m,列數爲n,則根據迭代次數可得,時間複雜度爲O(mn)。


而就空間而言,採用了額外的空間用於矩形左右邊界和高度的記錄,空間複雜度爲O(n)。

執行結果

學習 | 工作 | 分享

????長按關注“有理想的菜雞

只有你想不到,沒有你學不到

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章