LeetCode OJ - Maximal Rectangle

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

分析:題目太經典了,解題思路是參考別人的,解決辦法是建立在 Largest Rectangle in Histogram 基礎之上的。

        1.對於在一個一維數座標中找出最大的矩形面積,可以採用窮舉遍歷的方式時間複雜度爲O(n^2),但是也可以藉助棧來實現查找,棧的使用過程描述十分麻煩。 棧中存儲遞增序列的元素索引,對於一個新的元素若能保證棧中是遞增序列,那麼入棧;若是不能保證遞增序列,那麼出棧。 出棧時需要解決的是遞增序列所形成的各種面積的計算:若棧不爲空,那麼出棧元素爲高所形成的面積應與ret比較;若棧爲空了,之前出棧的一定是遞增序列中最小的元素,那麼height[minIndex] * 元素個數得到該元素形成的最大面積。

class Solution {
public:

    int largestRectangleArea(vector<int> &height) {
        height.push_back(0);
        stack<int> st;
        int i = 0, ret = 0;
           
        while(i < height.size()) {
            if(st.empty() || height[i] >= height[st.top()]) {
                st.push(i);
                i++;
            } else {
                int top = st.top();
                st.pop();
                 
                int width = st.empty() ? i : i - st.top() - 1;
                ret = max(ret, height[top] * width);
            }
        }
        
        return ret;
    }
};

        st棧底保存的是當前遍元素歷記錄中的最小值,最小值之後的元素(比最小值大)所形成的各種面積可以通過出棧解決。而最小值形成的面積寬度爲i,也可以輕易求出面積。

 

        2.對於2D面板可以看作多個一維數組,高度向下。

class Solution {
public:
    int maximalRectangle(vector<vector<char> > &matrix) {
        int row = matrix.size();
        if(row == 0) return 0;
        int col = matrix[0].size();
        
        for(int i = row - 1; i > 0 ; i--) {
            for(int j = 0; j < col; j++) {
                if(matrix[i][j] != '0' && matrix[i-1][j] != '0')
                    matrix[i-1][j] += (matrix[i][j] - '0');
            }
        }
        
        int ret = 0;
        for(int i = 0; i < row; i++) {
            ret = max(ret, largestRectangleArea(matrix[i]));
        }
        return ret;
    }  
};


 


發佈了210 篇原創文章 · 獲贊 3 · 訪問量 13萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章