1. 程式人生 > >【LeetCode】85. 最大矩形 結題報告 (C++)

【LeetCode】85. 最大矩形 結題報告 (C++)

原題地址:https://leetcode-cn.com/problems/maximal-rectangle/description/

題目描述:

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

示例:

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

解題方案:

參考連結:https://blog.csdn.net/LaputaFallen/article/details/79869806

 該連結包含正方形矩陣和矩形矩陣的解題思路,本題是矩形矩陣更難一些。運用到了動態規劃,現在就還沒完全搞明白這道題的解題方式。。。留著以後再學習。

class Solution {
public:
    int maximalRectangle(vector<vector<char>>& matrix) {
        if(matrix.empty()) return 0;
        int m = matrix.size();
        int n = matrix[0].size();
        int left[n], right[n], height[n];
        fill_n(left, n, 0); 
        fill_n(right, n, n); 
        fill_n(height, n, 0);
        int maxA = 0;
        for(int i = 0; i < m; i ++) {
            int cur_left = 0, cur_right = n; 
            for(int j = 0; j < n; j ++) { // compute height (can do this from either side)
                if(matrix[i][j] == '1') height[j] ++; 
                else height[j] = 0;
            }
            for(int j = 0; j < n; j ++) { // compute left (from left to right)
                if(matrix[i][j] == '1') left[j] = max(left[j], cur_left);
                else {
                    left[j] = 0; 
                    cur_left = j + 1;
                }
            }
            for(int j = n - 1; j >= 0; j --) { // compute right (from right to left)
                if(matrix[i][j] == '1') right[j] = min(right[j], cur_right);
                else {
                    right[j]=n; 
                    cur_right=j;
                }    
            }
            // compute the area of rectangle (can do this from either side)
            for(int j = 0; j < n; j ++)
                maxA = max(maxA, (right[j] - left[j]) * height[j]);
        }
        return maxA;
    }
};