求最大子矩陣的大小

題目

給定一個整型矩陣map, 其中的值只有0 和 1 兩種勇吊, 求其中全是1 的所有矩形區(qū)域中集峦, 最大的矩形區(qū)域為1的數(shù)量。

例如:

1 0 1 1

1 1 1 1

1 1 1 0

其中每辟,最大的矩形區(qū)域有6個1,所以返回6 干旧。

分析

若矩陣大小為O(MN)渠欺,則時間復(fù)雜度為O(MN)的解法為:

1.對矩陣的每一行進行切割,統(tǒng)計以當(dāng)前行為底的情況下椎眯,每個位置往上1的數(shù)量挠将。(若當(dāng)前位置為1胳岂,則統(tǒng)計從當(dāng)前位置開始向上連續(xù)1的數(shù)量;若當(dāng)前位置為0舔稀,則數(shù)量計為0)

例如map=1 0 1 1

1 1 1 1

1 1 1 0

第1行height={1乳丰,0,1内贮,1}

第2行height={2产园,1,2夜郁,2}

第3行height={3什燕,2,3竞端,0}

2.計算每一行為底的情況下屎即,最大的矩形是什么。

以height={3事富,2技俐,3,0}為例

image

實質(zhì)是在一個直方圖中求最大的矩形面積统台。如果能求出以每一根柱子擴展出去的最大矩形虽另,那么最大的矩形就是要求的答案。

而一根柱子可擴展的最大矩形受木桶原理約束饺谬,向左最遠擴展到第一根小于它的柱子捂刺,向右最遠擴展到第一根小于它的柱子。

像這種連續(xù)的取值募寨,取值只受前后兩端影響的情況族展,可以使用棧來實現(xiàn)。

以height={3拔鹰,4仪缸,5,4列肢,3恰画,6}為例,我們知道一根柱子的最大矩形的面積只受左右兩端影響瓷马,于是我們要求的就是每一根柱子的左右兩端位置拴还。
我們從左往右遍歷height,棧為空壓入3欧聘,此時柱子height[0] 的左端已經(jīng)確定片林,只需要確定柱子的右端。由此我們得到兩個關(guān)鍵邏輯:
1.只有當(dāng)前i位置的值heigh[i]大于當(dāng)前棧頂位置所代表的值(height[stack.peek()],則i位置才可以壓入stack
2.如果當(dāng)前i位置的值heigh[i]小于或等于當(dāng)前棧頂位置所代表的值(height[stack.peek()]费封,則把棧中存的位置不斷彈出焕妙,直到某一個棧頂所代表的值小于height[i],再把i位置壓入

當(dāng)height[i]小于height[stack.peek()]柱子的右端位置也確定了弓摘,這個很容易理解焚鹊。但是height[i]等于height[stack.peek()]時右端位置并沒有確定,在這種情況下韧献,height[i]與height[stack.peek()]所能擴到的左右端位置必定相同寺旺,于是我們可以將height[stack.peek()]出棧,通過height[i]來求得二者的最大面積势决。
最大矩形面積為(i-k-1)*height[j],其中i為當(dāng)前遍歷到的height位置蓝撇,k為棧頂位置果复,j為剛出棧的柱子位置。

注意渤昌,棧為空時左端位置可以記為-1虽抄,height遍歷完時右端位置可以記為height.length。

public class MaxRecSize {
    public int getMaxRecSize(int[][] map) {
        if (map == null || map.length == 0 || map[0].length == 0) {
            return 0;
        }
        int max = Integer.MIN_VALUE;
        int[] height = new int[map[0].length];
        for (int i = 0; i < map.length; i++) {
            for (int j = 0; j < map[0].length; j++) {
                height[j] = map[i][j] > 0 ? height[j] + 1 : 0;
            }
            max = Math.max(max, getMaxRexSizeFromBottom(height));
        }
        return max;
    }

    public int getMaxRexSizeFromBottom(int[] height) {
        if(height == null || height.length == 0) {
            return 0;
        }
        int max = Integer.MIN_VALUE;
        Stack<Integer> s = new Stack<Integer>();
        for (int i = 0; i < height.length; i++) {
            while (!s.isEmpty() && height[s.peek()] >= height[i]) {
                int current = s.pop();
                int top = s.isEmpty() ? -1 : s.peek();
                max = Math.max(max, (i - top - 1) * height[current]);
            }
            s.push(i);
        }
        while (!s.isEmpty()) {
            int current = s.pop();
            int top = s.isEmpty() ? -1 : s.peek();
            max = Math.max(max, (height.length - top - 1) * height[current]);
        }
        return max;
    }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末独柑,一起剝皮案震驚了整個濱河市迈窟,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌忌栅,老刑警劉巖车酣,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異索绪,居然都是意外死亡湖员,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進店門瑞驱,熙熙樓的掌柜王于貴愁眉苦臉地迎上來娘摔,“玉大人,你說我怎么就攤上這事唤反〉仕拢” “怎么了?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵彤侍,是天一觀的道長肠缨。 經(jīng)常有香客問我,道長盏阶,這世上最難降的妖魔是什么怜瞒? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上吴汪,老公的妹妹穿的比我還像新娘惠窄。我一直安慰自己,他們只是感情好漾橙,可當(dāng)我...
    茶點故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布杆融。 她就那樣靜靜地躺著,像睡著了一般霜运。 火紅的嫁衣襯著肌膚如雪脾歇。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天淘捡,我揣著相機與錄音藕各,去河邊找鬼。 笑死焦除,一個胖子當(dāng)著我的面吹牛激况,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播膘魄,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼乌逐,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了创葡?” 一聲冷哼從身側(cè)響起浙踢,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎灿渴,沒想到半個月后洛波,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡骚露,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年奋岁,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片荸百。...
    茶點故事閱讀 38,059評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡闻伶,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出够话,到底是詐尸還是另有隱情蓝翰,我是刑警寧澤,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布女嘲,位于F島的核電站畜份,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏欣尼。R本人自食惡果不足惜爆雹,卻給世界環(huán)境...
    茶點故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一停蕉、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧钙态,春花似錦慧起、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至驻子,卻和暖如春灿意,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背崇呵。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工缤剧, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人域慷。 一個月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓荒辕,卻偏偏與公主長得像,于是被迫代替她去往敵國和親芒粹。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,792評論 2 345

推薦閱讀更多精彩內(nèi)容

  • 《程序員代碼面試指南-左程云》筆記 第一章 棧和隊列 設(shè)計一個有g(shù)etMin功能的棧 實現(xiàn)一個特殊的棧大溜,在實現(xiàn)棧的...
    xiaogmail閱讀 18,378評論 2 19
  • 如果沒有記憶,你是誰付材?如果記憶里一片空白朦拖,你現(xiàn)在會做什么? 記憶厌衔,既是你生命的運轉(zhuǎn)程序璧帝。選擇怎樣的記憶,既是選擇怎...
    陳嘉玲閱讀 185評論 0 0
  • 今天我們上英語課的時候富寿,我們聽到有很多有趣的故事睬隶。戴老師上課時候,我們會聽到很多知識的页徐。今天我跟我后邊的同學(xué)換位置...
    小狐貍的麻麻閱讀 174評論 0 0
  • 如果說娛樂圈里最容易因戲生情的变勇,宋慧喬應(yīng)該是算一個了吧恤左。不鳴則已,一鳴驚人,前段時間雙宋CP直接跳過曖昧飞袋、戀愛等直...
    zubay閱讀 584評論 0 0
  • 小朋友戳气,請坐好, 大家一起唱童謠授嘀。 講衛(wèi)生物咳,有禮貌, 我們都是乖寶寶蹄皱。 愛父母览闰,敬師長, 熱愛學(xué)習(xí)心性好巷折。 新時代...
    愛詩的魚兒閱讀 197評論 0 3