其他分享
首页 > 其他分享> > 30 Day Challenge Day 22 | Leetcode 85. Maximal Rectangle

30 Day Challenge Day 22 | Leetcode 85. Maximal Rectangle

作者:互联网

题解

Hard

方法一:动态规划

这道题与84题联系在一起看,完全可以转化成84题的样子。对于每一行,只看其以上的数组元素,把连续的值为1的格子累加起来,就变成 histogram 了。

那么,在每一个值为1的坐标位置上,找到对应的左边界、右边界和上边界(即高度)。遍历一遍,就得到当前数组的最大矩形了。

class Solution {
public:
    int maximalRectangle(vector<vector<char>>& matrix) {
        if(matrix.empty()) return 0;
        
        int m = matrix.size();
        int n = matrix[0].size();
        
        vector<int> height(n, 0), left(n, 0), right(n, n-1);
        
        int maxArea = 0;

        for(int i = 0; i < m; i++) {
            int cur_left = 0, cur_right = n-1;

            // (1) update height[i] namely histogram
            for(int j = 0; j < n; j++) {
                if(matrix[i][j] == '1') {
                    height[j]++;
                } else {
                    height[j] = 0;
                }
            }
            
            // (2) update left[i]
            for(int j = 0; j < n; j++) {
                if(matrix[i][j] == '1') {
                    left[j] = max(left[j], cur_left);
                } else {
                    left[j] = 0; // go back to left most
                    cur_left = j+1;
                }                
            }            
            
            // (3) update right[i]
             for(int j = n-1; j >= 0; j--) {
                if(matrix[i][j] == '1') {
                    right[j] = min(right[j], cur_right);
                } else {
                    right[j] = n-1; // go back to right most
                    cur_right = j-1;
                }                 
            }

            // update maxArea
            for(int j = 0; j < n; j++) {
                maxArea = max(maxArea, (right[j]-left[j]+1)*height[j] );
            }
        }
        
        return maxArea;
    }
};

方法二:

标签:Maximal,right,matrix,22,int,cur,height,Day,left
来源: https://www.cnblogs.com/casperwin/p/13789880.html