85. Maximal Rectangle

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

For example, given the following matrix:

1 0 1 0 0
1 0 1 1 1
1 1 1 1 1
1 0 0 1 0

Return 6.

一刷
題解:
解題思路


根據(jù)上圖,可以清楚的看出本題可以轉(zhuǎn)化為Largest Rectangle in Histogarm來做
初始化height = [0, 0 ,0 ....]
對于每一行,先求出以這一行為x軸的每個柱子的高度,求解時(shí),可以每次基于上一行的值進(jìn)行更新。然后O(n)的時(shí)間求出最大矩形,不斷更新全局變量res
時(shí)間復(fù)雜度為 O(n * (n + n)) = O(n2)

public class Solution {
    public int maximalRectangle(char[][] matrix) {
       if(matrix == null || matrix.length == 0) return 0;
       
       int colNum = matrix[0].length;
       int[] accumulatedHeights = new int[colNum];
       int max = 0;
       for(char[] row : matrix){
           for(int i=0; i<colNum; i++){
               //the accumulated, consecutive number of 1
                accumulatedHeights[i] = row[i] == '0' ? 0 : accumulatedHeights[i] + 1;
           }
           max = Math.max(calcLargestHist(accumulatedHeights), max);
       }
       return max;
    }
    
    private int calcLargestHist(int[] heights){
         if(heights == null || heights.length == 0) return 0;
        Stack<Integer> stack = new Stack<Integer>();//store the index
        int max = 0;
        for(int i=0; i<=heights.length; i++){
            int curt = (i == heights.length)? -1: heights[i];//guaranteen the stack is ascending
            while(!stack.isEmpty() && curt<=heights[stack.peek()]){
                int h = heights[stack.pop()];
                int w = stack.isEmpty()? i: i - stack.peek() - 1;
                max = Math.max(max, h*w);
            }
            stack.push(i);
        }
        
        return max;
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 背景 一年多以前我在知乎上答了有關(guān)LeetCode的問題, 分享了一些自己做題目的經(jīng)驗(yàn)。 張土汪:刷leetcod...
    土汪閱讀 12,922評論 0 33
  • 世界的精彩之處在于每個人都是豐富獨(dú)立的個體,我們不斷變化和成長著。但是總有發(fā)現(xiàn)我們做很多事情都彰顯著我們的內(nèi)在性格...
    山水之滴閱讀 18,039評論 0 2
  • 一,為什么想起來要練習(xí)普通話? 工作和自身素質(zhì)讓自己要學(xué)說好普通話。 自己工作常常要對人講話,自己家鄉(xiāng)一直平...
    晚間一壺茶閱讀 1,691評論 2 1
  • 今天的想和大家分享一個關(guān)于情感關(guān)系的小tip?? 我和小舟屬于異地(準(zhǔn)確說是異國)~不在一起的時(shí)候會十分想念對方,特...
    蛋糕小屋閱讀 272評論 0 0
  • 思想的巨人,行動的矮子 我妹總說我是思想的巨人,行動的矮子。哈哈,有時(shí)候覺得挺搞笑的,發(fā)現(xiàn)身邊的人會比自己更了解自...
    1朵云閱讀 368評論 10 3

友情鏈接更多精彩內(nèi)容