[LeetCode] 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.

Example:

Input:
[
  ["1","0","1","0","0"],
  ["1","0","1","1","1"],
  ["1","1","1","1","1"],
  ["1","0","0","1","0"]
]
Output: 6

這道題可以類似之前那道Largest Rectangle in Histogram 直方圖中最大的矩形一樣求解哈肖。主要思路是腾仅,每一行都可以看作是求解一個直方圖中的最大矩形蛔添。因此趾唱,只需要將每一層當(dāng)作直方圖的底,并向上構(gòu)造直方圖即可站欺。

直方圖的高可以用dp得到:

  1. 若matrix[i][col] == 1, 則height[i] = height[i-1]+1
  2. 若matrix[i][col] == 0, 則height[i] = 0

方法一:

class Solution {
public:
    int maximalRectangle(vector<vector<char>>& matrix) {
        if (matrix.empty() || matrix[0].empty()) return 0;
        int res = 0, m = matrix.size(), n = matrix[0].size();
        vector<int> height(n + 1);
        for (int i = 0; i < m; ++i) {
            stack<int> s;
            for (int j = 0; j < n + 1; ++j) {
                if (j < n) {
                    height[j] = matrix[i][j] == '1' ? height[j] + 1 : 0;
                }
                while (!s.empty() && height[s.top()] >= height[j]) {
                    int cur = s.top(); s.pop();
                    res = max(res, height[cur] * (s.empty() ? j : (j - s.top() - 1)));
                }
                s.push(j);
            }
        }
        return res;
    }
};

第二種種方法的思路比較巧:
height 數(shù)組和上面一樣姨夹,
left[j]表示:包含第j列的連續(xù)都是1的左邊界的位置(若height[j]=0纤垂,則 left[j]=0)
right[j]表示:包含第j列的連續(xù)都是1的右邊界的位置再加1(加1是為了計算長度方便,直接減去左邊界位置就是長度)

那么對于任意一行的第j列磷账,矩形為 (right[j] - left[j]) * height[j]峭沦,我們舉個例子來說明,比如給定矩陣為:

[
  [1, 1, 0, 0, 1],
  [0, 1, 0, 0, 1],
  [0, 0, 1, 1, 1],
  [0, 0, 1, 1, 1],
  [0, 0, 0, 0, 1]
]

第0行:

h: 1 1 0 0 1
l: 0 0 0 0 4
r: 2 2 5 5 5 

第1行:

h: 0 2 0 0 2
l: 0 1 0 0 4
r: 5 2 5 5 5 

第2行:

h: 0 0 1 1 3
l: 0 0 2 2 4
r: 5 5 5 5 5

第3行:

h: 0 0 2 2 4
l: 0 0 2 2 4
r: 5 5 5 5 5

第4行:

h: 0 0 0 0 5
l: 0 0 0 0 4
r: 5 5 5 5 5 

方法二:

    int maximalRectangle(vector<vector<char>>& matrix) {
        int row = matrix.size();
        if(row <= 0) return 0;
        int col = matrix[0].size();
        
        vector<int> left(col),right(col),height(col);
        int res = 0;
        
        for(int i = 0; i < col; i++){
            left[i] = 0;
            right[i] = col;
            height[i] = 0;
        }
        
        for(int i = 0; i < row; i++){
            int cur_left = 0, cur_right = col;
            
            //update height
            for(int j = 0; j < col; j++){
                if(matrix[i][j] == '1') height[j] += 1;
                else height[j] = 0;
            }
            
            //update left
            for(int j = 0; j < col; j++){
                if(matrix[i][j] == '1') {
                    left[j] = max(left[j],cur_left);
                }
                else {
                    left[j] = 0;
                    cur_left = j+1;
                }
            }
            
            //update right
            for(int j = col-1; j >= 0; j--){
                if(matrix[i][j] == '1') {
                    right[j] = min(right[j],cur_right);
                }
                else {
                    right[j] = col;
                    cur_right = j;
                }
            }
            
            //update res
            for(int j = 0; j < col; j++){
                res = max(res,(right[j]-left[j])*height[j]);
            }
        }
        
        return res;
    }
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末够颠,一起剝皮案震驚了整個濱河市熙侍,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌履磨,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,252評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件庆尘,死亡現(xiàn)場離奇詭異剃诅,居然都是意外死亡,警方通過查閱死者的電腦和手機驶忌,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,886評論 3 399
  • 文/潘曉璐 我一進店門矛辕,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人付魔,你說我怎么就攤上這事聊品。” “怎么了几苍?”我有些...
    開封第一講書人閱讀 168,814評論 0 361
  • 文/不壞的土叔 我叫張陵翻屈,是天一觀的道長。 經(jīng)常有香客問我妻坝,道長伸眶,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,869評論 1 299
  • 正文 為了忘掉前任刽宪,我火速辦了婚禮厘贼,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘圣拄。我一直安慰自己嘴秸,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 68,888評論 6 398
  • 文/花漫 我一把揭開白布庇谆。 她就那樣靜靜地躺著岳掐,像睡著了一般。 火紅的嫁衣襯著肌膚如雪族铆。 梳的紋絲不亂的頭發(fā)上岩四,一...
    開封第一講書人閱讀 52,475評論 1 312
  • 那天,我揣著相機與錄音哥攘,去河邊找鬼剖煌。 笑死材鹦,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的耕姊。 我是一名探鬼主播桶唐,決...
    沈念sama閱讀 41,010評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼茉兰!你這毒婦竟也來了尤泽?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,924評論 0 277
  • 序言:老撾萬榮一對情侶失蹤规脸,失蹤者是張志新(化名)和其女友劉穎坯约,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體莫鸭,經(jīng)...
    沈念sama閱讀 46,469評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡闹丐,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,552評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了被因。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片卿拴。...
    茶點故事閱讀 40,680評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖梨与,靈堂內(nèi)的尸體忽然破棺而出堕花,到底是詐尸還是另有隱情,我是刑警寧澤粥鞋,帶...
    沈念sama閱讀 36,362評論 5 351
  • 正文 年R本政府宣布缘挽,位于F島的核電站,受9級特大地震影響陷虎,放射性物質(zhì)發(fā)生泄漏到踏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,037評論 3 335
  • 文/蒙蒙 一尚猿、第九天 我趴在偏房一處隱蔽的房頂上張望窝稿。 院中可真熱鬧,春花似錦凿掂、人聲如沸伴榔。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,519評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽踪少。三九已至,卻和暖如春糠涛,著一層夾襖步出監(jiān)牢的瞬間援奢,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,621評論 1 274
  • 我被黑心中介騙來泰國打工忍捡, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留集漾,地道東北人切黔。 一個月前我還...
    沈念sama閱讀 49,099評論 3 378
  • 正文 我出身青樓,卻偏偏與公主長得像具篇,于是被迫代替她去往敵國和親纬霞。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,691評論 2 361

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