1. 程式人生 > >LeetCode 題解:85. Maximal Rectangle

LeetCode 題解:85. Maximal Rectangle

Given a 2D binary matrix filled with 0’s and 1’s, find the largest rectangle containing only 1’s and return its area.

Example:
Input:
[
  ["1","0","1","0","0"],
  ["1","0","1","1","1"],
  ["1","1","1","1","1"],
  ["1","0","0","1","0"]
]
Output: 6

解題思路

這道題的解題思路和前面的84題相近(Largest Rectangle in Histogram),可以理解為將此題中的二維陣列的每一行當做是84題中的一維的高度統計陣列,那麼統計二維矩陣中面積最大的長方形,就可以轉變為先求每一個一維統計陣列的最大矩形面積,然後求所有統計陣列求得的矩形的面積的最大值。
具體演算法如下:
1.建立記錄陣列dp[n][m+1],此處的m+1是為了求最大矩形面積時能夠有一個終止位置(類似84題),所以要比原二維陣列多一列
2.每一個統計陣列的元素的值為該位置所對應的二維陣列的列從當前行往上遍歷能夠得到的最長連續“1”序列的長度,若沒有連續“1”序列,則賦為0。
3.利用84題中計算最大矩形面積的演算法為每一個統計陣列記錄它能得到的最大矩形面積(

84題演算法
4.取(3)中得到的所有矩形面積中的最大值作為最終答案

C++程式碼

class Solution {
public:
    int calculateMaxArea(vector<int>& heights) {
        stack<int> rec;
        int res = 0;
        for(int i = 0; i < heights.size();) {
            if(rec.empty() || heights[rec.top()] <= heights[i]) {
                rec.
push(i); i++; } else { int r = rec.top(); rec.pop(); res = max(res, heights[r] * (rec.empty()? i : i - rec.top() - 1)); } } return res; } int maximalRectangle(vector<vector<
char>>& matrix) { if(matrix.size() == 0 || matrix[0].size() == 0) return 0; vector<vector<int>> dp(matrix.size(), vector<int>(matrix[0].size()+1)); int res = 0; for(int i = 0; i < matrix[0].size(); i++) { dp[0][i] = matrix[0][i] == '0'? 0 : 1; for(int j = 1; j < matrix.size(); j++) { dp[j][i] = matrix[j][i] == '1'? dp[j-1][i]+1 : 0; } } for(int i = 0; i < dp.size(); i++) { int r = calculateMaxArea(dp[i]); res = max(res, r); } return res; } };