Maximal Rectangle 题解


题目描述

Maximal Rectangle
即寻找矩阵S中最大的被1填充的矩形子块面积。矩形子块s面积即字面义:矩形子块s的面积。
如:S=

[1 0 1 0 0
 1 0 1 1 1
 1 1 1 1 1
 1 0 0 1 0]

最大的矩形子块面积6,此矩形子块s=[1 1 1; 1 1 1]

题解

Largest Rectangle in Histogram的变形。可以这么转换,二维的矩形的横轴对应Histogram的长度,纵轴对应Histogram的高度。从左到右,从上到下遍历一次即可。假设矩阵大小为n * n,时间复杂度为O(n^2),空间复杂度为O(n)

代码

typedef unsigned int uint;
static const uint MAX_SIZE = 0x100;
static uint keep[MAX_SIZE], heights[MAX_SIZE];
class Solution {
public:
    int maximalRectangle(vector<vector<char>>& matrix) {
        size_t rect = 0U;
        memset(heights, 0, sizeof(heights));
        for (size_t i = matrix.size(); i--; ) {
            const vector<char>& vec = matrix[i];
            size_t len = vec.size(), keepEnd = 0;
            for (keep[0] = len; len--; keep[++keepEnd] = len) {
                heights[len] = vec[len] == '0'? 0 : heights[len] + 1;
                uint tmp = heights[len], pos = keep[keepEnd];
                do {
                    uint area = heights[pos];
                    if (tmp >= area)
                        break;
                    pos = keep[--keepEnd];
                    if ((area *= (pos - len - 1U)) > rect)
                        rect = area;
                } while (keepEnd);
            }

            while (keepEnd) {
                uint area = heights[keep[keepEnd]];
                if ((area *= keep[--keepEnd]) > rect)
                    rect = area;
            }
        }
        return rect;
    }
};

总结

主要应用了等价转化的思想。


Caesar
53 声望1 粉丝

Hustle-As-A-Service