LeetCode HOT100 - 最大矩形

长和宽都是 200,但是完全暴力显然是不太可行的

如果我们要同时考虑行和列,那么复杂度不太会降

所以尝试固定其中一项,比如固定行,在这个确定要用最底的行去找矩形的前提下思考

这时候只有柱形图是有用的,那么问题就转成了柱形图求最大矩阵

这就比较容易考虑了,我们维护一个单调递增栈,这是因为我们每次添加元素都是在考虑能不能把栈里面的元素都处理完,栈中存放的只是还没有被处理的部分

当栈中的元素比要入栈的元素大,那这个元素向右能作用的就不是它了,因为高度取决于柱子中的最小值,所以相当于这个元素最大能干涉的被完成了,所以出栈了

最后要额外入栈一个 0 是为了把栈中仍然存在的元素统一处理完

这样我们每行更新下这个柱状图,然后处理

class Solution {
public:
    int maximalRectangle(vector<vector<char>>& a) {
        int n = a.size();
        int m = a[0].size();
        vector<int> h(m, 0);
        int ans = 0;
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                if (a[i][j] == '1') {
                    h[j]++;
                } else {
                    h[j] = 0;
                }
            }
            vector<int> st;
            for (int k = 0; k <= m; k++) {
                int cur = (k == m ? 0 : h[k]);
                while (!st.empty() && h[st.back()] >= cur) {
                    int mid = st.back();
                    st.pop_back();
                    ans = max(ans, h[mid] * (k - (st.empty() ? -1 : st.back()) - 1));
                }
                st.push_back(k);
            }
        }
        return ans;
    }
};
posted @ 2026-05-08 14:37  rdcamelot  阅读(15)  评论(0)    收藏  举报