菜雞每日一題系列打卡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)。
執行結果
學習 | 工作 | 分享
????長按關注“有理想的菜雞”
只有你想不到,沒有你學不到