【ALGO】Leetcode 85.最大矩形

minuxAE發表於2020-10-13

題面

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

解析

本題如果直接採用暴力列舉的解法,時間複雜度為 O ( n 6 ) \mathcal{O}(n^6) O(n6),考慮列舉下邊界加預處理進行時間複雜度優化.
列舉第 i i i行,設第 i i i行第 j j j列的向上連續的1的個數為 f ( i , j ) f(i, j) f(i,j),則
f ( i , j ) = { 0 , m a t r i x ( i , j ) = 0 1 + f ( i − 1 , j ) , m a t r i x ( i , j ) = 1 f(i, j)= \begin{cases} 0, matrix(i, j)=0\\ 1+f(i-1, j), matrix(i, j)=1 \end{cases} f(i,j)={0,matrix(i,j)=01+f(i1,j),matrix(i,j)=1
然後問題可以轉化為Leetcode 84.柱狀圖中最大矩形求解.

AC程式碼

class Solution {
private:
    int largestRectangleArea(vector<int>& heights) {
        int n = heights.size();
        vector<int> left(n), right(n);
        stack<int> st; // 儲存下標的單調棧

        // left->right sweep
        for(int i=0; i<n; ++i){
            while(!st.empty() && heights[st.top()]>=heights[i]) st.pop();
            if(st.empty()) left[i]=-1;
            else left[i]=st.top();
            st.push(i);
        }

        st = stack<int>();
        // right->left sweep
        for(int i=n-1; ~i; --i){
            while(!st.empty() && heights[st.top()]>=heights[i]) st.pop();
            if(st.empty()) right[i]=n;
            else right[i]=st.top();
            st.push(i);
        }

        int ans=0;
        for(int i=0; i<n; ++i){
            ans=max(ans, heights[i]*(right[i]-left[i]-1));
            // cout<<heights[i]<<" "<<left[i]<<" "<<right[i]<<endl;
        }

        return ans;
    }

public:
    int maximalRectangle(vector<vector<char>>& matrix) {
        if(matrix.empty() || matrix[0].empty()) return 0;
        int n = matrix.size(), m=matrix[0].size();
        
        vector<vector<int>> f(n, vector<int>(m)); // 上方有多少個連續的1

        for(int i=0; i<n; ++i)
            for(int j=0; j<m; ++j){
                if(matrix[i][j]=='1' && i) f[i][j]=1+f[i-1][j];
                else if(matrix[i][j]=='1') f[i][j]=1;
                else f[i][j]=0;
            }

        int ans = 0;
        for(int i=0; i<n; ++i) ans=max(ans, largestRectangleArea(f[i])); // 列舉下邊界
        return ans;
    }
};

相關文章