LeetCode No.84

最大矩形

給定 n 個非負整數(shù),用來表示柱狀圖中各個柱子的高度。每個柱子彼此相鄰寨腔,且寬度為 1 速侈。

求在該柱狀圖中,能夠勾勒出來的矩形的最大面積迫卢。


LeetCode圖

以上是柱狀圖的示例倚搬,其中每個柱子的寬度為 1,給定的高度為 [2,1,5,6,2,3]乾蛤。


LeetCode圖

圖中陰影部分為所能勾勒出的最大矩形面積每界,其面積為 10 個單位。

示例:
輸入: [2,1,5,6,2,3]
輸出: 10

題目分析

  1. 想要知道最大矩形家卖,肯定先要知道每根柱子怎么形成矩形的
  2. 對柱子 i眨层,高度為 hi,以i為中心往兩邊擴展上荡,只要碰到的柱子高度 Hj>=hi趴樱,那么形成的矩形必然是以 hi 為高構(gòu)造。
  3. 假如 Hj<hi酪捡,那么這個矩形的高就是新的 Hj叁征,而這個 Hj 構(gòu)造的矩形必然會出現(xiàn)在以柱子 j 為中心擴展的時候,所以不必考慮降低現(xiàn)在的高度逛薇。
  4. 所以對柱子 i 的擴展捺疼,往左右兩邊找总棵,碰到矮的停下來,確定兩邊邊界椰拒,邊界高度 Hj>=hi滋觉,這個即是這個 i 自己能做出來的最大矩形。

可以雙重循環(huán)掃描屡律,但不是重點,這里學(xué)習(xí)題解大神的棧思路。

題解分析:棧保留邊界

  1. 首先有一層主循環(huán)遍歷所有柱子产捞,從左到右,當前柱子為 i哼御。

  2. 我們目的是要找i的兩個邊界坯临,因為是從左到右掃描,即我們可以順手找到 i 的右邊界恋昼。只要掃描時碰到比 i 矮的就知道這個是右邊界了看靠。

  3. 但是碰到比 i 高或者相等的柱子 j 怎么辦呢?j 不會是 i 的邊界 液肌,但我們也要找 j 的邊界挟炬。因此我們要把未處理的 i 和 j 都留下來。

  4. 而繼續(xù)往后找的時候, i 的右邊界x 必然是 j 的右邊界或者之外 (hi<=hj) 谤祖。
    因此對于下一個柱子 x:
    4.1 假如我們先判斷 x 是不是 i 的邊界婿滓,假如它是,它也不一定就是 j 的右邊界 粥喜,我們還得用 x 和 j 比較一次凸主。假如它不是,它也不一定就不是 j 的右邊界额湘,還是得 x j 比較一次卿吐,所以先判定 i 的邊界很雞肋
    4.2 假如先判斷 x 是不是更高的 j 的右邊界缩挑,假如它不是但两,那么肯定也不是 i 的邊界,假如它是供置,那么可以繼續(xù)判定是不是更矮的 i 的右邊界谨湘。

  5. 因此,我們的掃描過程是這樣的芥丧,從左到右紧阔,且保留的柱子高度遞增(因為只要更高的才會保留,否則是作為右邊界判定)续担。
    且判定的順序是高的在前擅耽,低的在后,即新的在前物遇,舊的在后乖仇,因此保留柱子的數(shù)據(jù)結(jié)構(gòu)是:棧
    因此遇到一個新柱子询兴,與棧頂比較乃沙,更高則繼續(xù)壓棧。更低則是棧頂?shù)挠疫吔缡ⅲ缓髼m敵鰲>澹卸ㄊ遣皇窍乱粋€棧頂?shù)挠疫吔纭?/p>

  6. 右邊界解決了,我們還需要確定每個柱子 i 的左邊界眶根,左邊界肯定在左邊 蜀铲, 并且左邊界也要比 i 矮,而我們的棧又是高度遞增的= =+顯然属百,我們可以利用出棧過程记劝。
    在棧頂確定了右邊界,然后出棧的時候:
    6.1 下面的那個柱子高度大于【棧頂右邊界高度Hr】族扰,那么這個柱子不是左邊界厌丑,而可以組成這個矩形(因為有右邊界后钳恕,矩形最低高度是Hr,只要高于Hr蹄衷,都是)我們繼續(xù)出棧尋找即可忧额。
    6.2 即一直出棧,直到出了個高度小于等于【棧頂右邊界高度Hr】的柱子 x 愧口,那么 x 就是上面這個矩形的左邊界睦番。

出棧到邊界了怎么辦?在數(shù)組開頭預(yù)備一個0作為棧底標志位結(jié)束出棧耍属。
同樣壓棧到邊界了怎么辦托嚣?在數(shù)組結(jié)尾預(yù)備一個0作為啟動出棧的標志位。

  1. 此時 i 的左右邊界都能找到厚骗,高度為 i 示启,計算面積。

總之精髓在于出棧過程领舰,從棧頂?shù)挠疫吔绶蛏ぃ恢背鰲5綕M足的左邊界,中間這些柱子形成當前最大矩形冲秽。

題解代碼

class Solution {
public:
    int largestRectangleArea(vector<int>& heights) 
    {
        //題解學(xué)習(xí)
        std::stack<int> Lefts;
        heights.insert(heights.begin(),0);//補0作為邊界判斷
        heights.insert(heights.end(),0);
        int result=0;
        int temp;
        for(int i=0;i<heights.size();i++)
        {   
            //棧單調(diào)遞增舍咖,當碰到一個i 比棧頂矮,則它必是棧頂?shù)挠疫吔?            //再逐漸出棧锉桑,每次出棧循環(huán)排霉,都是棧頂作為中心,而棧單調(diào)遞增民轴,棧頂下面一個更矮的必是棧頂?shù)淖筮吔绻ツ笥疫吔绱_定,則棧頂位置能形成的矩陣面積可計算完畢后裸。
            //直到棧頂比 i 還矮瑰钮,那 i 就不能作為右邊界了 ,棧頂此時的右邊界也找不到轻抱,則 i 入棧待命當左邊界飞涂,然后for下一輪
            while(Lefts.empty()!=true && heights[Lefts.top()]>heights[i])//找到比棧頂矮的柱子旦部,即棧頂柱子的右邊界
            {     
                temp=Lefts.top();
                Lefts.pop();
                result = max(result, (i - Lefts.top()-1)*heights[temp]);
            }
            Lefts.push(i);
        }

        return result;


    }
};
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末祈搜,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子士八,更是在濱河造成了極大的恐慌容燕,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,607評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件婚度,死亡現(xiàn)場離奇詭異蘸秘,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,239評論 3 395
  • 文/潘曉璐 我一進店門醋虏,熙熙樓的掌柜王于貴愁眉苦臉地迎上來寻咒,“玉大人,你說我怎么就攤上這事颈嚼∶兀” “怎么了?”我有些...
    開封第一講書人閱讀 164,960評論 0 355
  • 文/不壞的土叔 我叫張陵阻课,是天一觀的道長叫挟。 經(jīng)常有香客問我,道長限煞,這世上最難降的妖魔是什么抹恳? 我笑而不...
    開封第一講書人閱讀 58,750評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮署驻,結(jié)果婚禮上奋献,老公的妹妹穿的比我還像新娘。我一直安慰自己旺上,他們只是感情好秽荞,可當我...
    茶點故事閱讀 67,764評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著抚官,像睡著了一般扬跋。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上凌节,一...
    開封第一講書人閱讀 51,604評論 1 305
  • 那天钦听,我揣著相機與錄音,去河邊找鬼倍奢。 笑死朴上,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的卒煞。 我是一名探鬼主播痪宰,決...
    沈念sama閱讀 40,347評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼畔裕!你這毒婦竟也來了衣撬?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,253評論 0 276
  • 序言:老撾萬榮一對情侶失蹤扮饶,失蹤者是張志新(化名)和其女友劉穎具练,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體甜无,經(jīng)...
    沈念sama閱讀 45,702評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡扛点,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,893評論 3 336
  • 正文 我和宋清朗相戀三年哥遮,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片陵究。...
    茶點故事閱讀 40,015評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡眠饮,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出铜邮,到底是詐尸還是另有隱情君仆,我是刑警寧澤,帶...
    沈念sama閱讀 35,734評論 5 346
  • 正文 年R本政府宣布牲距,位于F島的核電站返咱,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏牍鞠。R本人自食惡果不足惜咖摹,卻給世界環(huán)境...
    茶點故事閱讀 41,352評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望难述。 院中可真熱鬧萤晴,春花似錦、人聲如沸胁后。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,934評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽攀芯。三九已至屯断,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間侣诺,已是汗流浹背殖演。 一陣腳步聲響...
    開封第一講書人閱讀 33,052評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留年鸳,地道東北人趴久。 一個月前我還...
    沈念sama閱讀 48,216評論 3 371
  • 正文 我出身青樓,卻偏偏與公主長得像搔确,于是被迫代替她去往敵國和親彼棍。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,969評論 2 355

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

  • 題目 給定一個整數(shù)map膳算,其中的值只有0和1兩種座硕,求其中全是1的所有矩形區(qū)域中最大的矩形區(qū)域為1的數(shù)量。??例如:...
    呤雪情楓閱讀 552評論 0 1
  • 題目描述(困難難度) 給一個柱狀圖畦幢,輸出一個矩形區(qū)域的最大面積坎吻。 解法一 暴力破解 以題目給出的例子為例缆蝉,柱形圖高...
    windliang閱讀 616評論 0 0
  • 題目地址: https://leetcode-cn.com/problems/largest-rectangle-...
    xuzhougeng閱讀 268評論 0 1
  • //這是19號的話~拖了一天了以后不能隨便發(fā)pyp了//??我們還是很水的宇葱,hduoj做到最后腦殼疼現(xiàn)在還是先把今天...
    Vincy_ivy閱讀 1,651評論 0 2
  • 殺死一只知更鳥瘦真,p48 今日下雨
    幾近光明閱讀 207評論 0 0