2018-11-15 Summary lc42/84 單調(diào)棧

主要兩個(gè)題目:
leetcode 42 Trapping Rain Water
lletcode 84 Largest Rectangle in Histogram
結(jié)合兩個(gè)題目尿褪,學(xué)習(xí)了單調(diào)棧的基本概念和基本用法

42:自己做的方法:暴力遍歷涎跨,但是要處理各種特殊情況,修改了很多次才AC

class Solution {
    public int trap(int[] height) {
        int res = 0;
        if (height.length<3) return res;
        //System.out.println("line 5");
        for (int i=0;i<height.length-1;i++){
            if (height[i+1]>=height[i]) continue;
            int sum_i = 0;
            int max_min = 0;
            int max_min_j = 0;
            //System.out.println("i="+i);
            for (int j=i+1;j<height.length;j++){
                if (height[j]>=height[i]){
                    for (int k=i+1;k<j;k++)
                        sum_i += height[i] - height[k];
                    //System.out.println("no. "+i+" :res+ "+sum_i);
                    i = j-1;
                    break;
                }
                else{                   
                    if (height[j] >= max_min){
                        max_min_j = j;
                        max_min = Math.max(max_min, height[j]);
                    }
                }
                
                if (j == height.length-1){
                    //System.out.println("no. "+i+" :max_min+ "+max_min);
                    for (int k=i+1;k<max_min_j;k++)
                        sum_i += max_min - height[k];
                    i = max_min_j-1;
                }
            }
            res += sum_i;
        }
        return res;
    }
}

基本思想是從某處開始往后找比這一處大的瞧毙,找到就求這個(gè)“凹槽”的積水值。

剛開始不過的點(diǎn)在于:

  • 如果在后面沒有找到比現(xiàn)在大的,就要記錄后面的最大值宙彪,然后求該處到max_min處的雨水?dāng)?shù)量矩动。
  • 此解法中,每求一次區(qū)間面積您访,就要更新i到j(luò)-1(for循環(huán)會(huì)對(duì)i+1)铅忿,所以下一次從j處開始處理。

覺得這個(gè)解法實(shí)在是很蠢灵汪,但是ac結(jié)果卻挺好

執(zhí)行用時(shí): 12 ms, 在Trapping Rain Water的Java提交中擊敗了99.55% 的用戶

代碼里嵌套了三層循環(huán)檀训,很不優(yōu)化了,所以對(duì)這個(gè)ac結(jié)果感覺很奇怪...

閱讀了lc社區(qū)里的文章享言,學(xué)習(xí)到的三個(gè)方法都很有價(jià)值:

  • 單調(diào)棧(遞減棧)
  • DP 從兩頭分別遍歷一次峻凫,保存每個(gè)點(diǎn)的左右最大值
  • 雙指針的使用(精妙)


    方法三
class Solution {
 public int trap(int[] height) {
        int left = 0;
        int right = height.length - 1;
        int result = 0;
        int leftMax=0, rightMax=0;
        while(left < right){
            if(height[left] < height[right]){
                leftMax = Math.max(height[left], leftMax);
                result += leftMax - height[left];
                left++;
            }else{
                rightMax = Math.max(height[right], rightMax);
                result += rightMax - height[right];
                right--;
            }
        }
        return result;
}
}

基本思想是:左邊右邊設(shè)置雙指針,左邊小于右邊览露,則計(jì)算左邊處積水值荧琼,移動(dòng)左指針;否則計(jì)算右邊積水值差牛,更新右指針命锄。兩個(gè)指針最終相遇于最大值處。
根據(jù)是:在此方法中偏化,左指針右邊有大于該處的值脐恩,則該處積水值由左邊最大值決定; 右指針左邊有大于該處的值侦讨,則該處積水值由右邊最大值決定驶冒。

Complexity analysis

  • Time complexity: O(n)O(n). Single iteration of O(n)O(n).
  • Space complexity: O(1)O(1) extra space. Only constant space required for left, right, left_max and right_max.

綜合考慮時(shí)間復(fù)雜度、空間復(fù)雜度韵卤,這應(yīng)該是本問題的最佳解法骗污;

單調(diào)棧是本題接觸的方法,在直方圖最大矩形中也用到了單調(diào)棧沈条,但是當(dāng)時(shí)沒有注意這個(gè)概念需忿。本題使用遞減單調(diào)棧,而84使用遞增單調(diào)棧拍鲤,兩個(gè)題目對(duì)比琢磨贴谎,很值得學(xué)習(xí)。

待學(xué)習(xí):原地歸并排序算法
熟悉arrays.copyOf System.arraycopy等方法
閱讀官方文檔

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末季稳,一起剝皮案震驚了整個(gè)濱河市擅这,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌景鼠,老刑警劉巖仲翎,帶你破解...
    沈念sama閱讀 222,183評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件痹扇,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡溯香,警方通過查閱死者的電腦和手機(jī)鲫构,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來玫坛,“玉大人结笨,你說我怎么就攤上這事∈疲” “怎么了炕吸?”我有些...
    開封第一講書人閱讀 168,766評(píng)論 0 361
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)勉痴。 經(jīng)常有香客問我赫模,道長(zhǎng),這世上最難降的妖魔是什么蒸矛? 我笑而不...
    開封第一講書人閱讀 59,854評(píng)論 1 299
  • 正文 為了忘掉前任瀑罗,我火速辦了婚禮,結(jié)果婚禮上雏掠,老公的妹妹穿的比我還像新娘斩祭。我一直安慰自己,他們只是感情好乡话,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,871評(píng)論 6 398
  • 文/花漫 我一把揭開白布停忿。 她就那樣靜靜地躺著,像睡著了一般蚊伞。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上吮铭,一...
    開封第一講書人閱讀 52,457評(píng)論 1 311
  • 那天时迫,我揣著相機(jī)與錄音,去河邊找鬼谓晌。 笑死掠拳,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的纸肉。 我是一名探鬼主播溺欧,決...
    沈念sama閱讀 40,999評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼柏肪!你這毒婦竟也來了姐刁?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,914評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤烦味,失蹤者是張志新(化名)和其女友劉穎聂使,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,465評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡柏靶,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,543評(píng)論 3 342
  • 正文 我和宋清朗相戀三年弃理,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片屎蜓。...
    茶點(diǎn)故事閱讀 40,675評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡痘昌,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出炬转,到底是詐尸還是另有隱情辆苔,我是刑警寧澤,帶...
    沈念sama閱讀 36,354評(píng)論 5 351
  • 正文 年R本政府宣布返吻,位于F島的核電站姑子,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏测僵。R本人自食惡果不足惜街佑,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,029評(píng)論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望捍靠。 院中可真熱鬧沐旨,春花似錦、人聲如沸榨婆。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,514評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽良风。三九已至谊迄,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間烟央,已是汗流浹背统诺。 一陣腳步聲響...
    開封第一講書人閱讀 33,616評(píng)論 1 274
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留疑俭,地道東北人粮呢。 一個(gè)月前我還...
    沈念sama閱讀 49,091評(píng)論 3 378
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像钞艇,于是被迫代替她去往敵國(guó)和親啄寡。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,685評(píng)論 2 360

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

  • LeetCode 刷題隨手記 - 第一部分 前 256 題(非會(huì)員)哩照,僅算法題挺物,的吐槽 https://leetc...
    蕾娜漢默閱讀 17,817評(píng)論 2 36
  • 背景 一年多以前我在知乎上答了有關(guān)LeetCode的問題, 分享了一些自己做題目的經(jīng)驗(yàn)。 張土汪:刷leetcod...
    土汪閱讀 12,748評(píng)論 0 33
  • 1. 找出數(shù)組中重復(fù)的數(shù)字 題目:在一個(gè)長(zhǎng)度為n的數(shù)組里的所有數(shù)字都在0到n-1的范圍內(nèi)葡秒。數(shù)組中某些數(shù)字是重復(fù)的姻乓,...
    BookThief閱讀 1,775評(píng)論 0 2
  • 高考后一直想去旅游的愿望總是被擱淺,今年國(guó)慶:坐標(biāo)福州剪个。 生活總是讓你感到疲憊秧骑,但我們的心中還是懷揣夢(mèng)想。 愿你在...
    木楊夏子閱讀 225評(píng)論 0 1
  • 神鳥的事傳到了一個(gè)富商那里扣囊,他想:要是我能捉住神鳥乎折,那該多好啊,于是他貼出公告:“凡是捉住神鳥者侵歇,賞千金骂澄,馬萬匹。...
    天下為民在岳陽閱讀 311評(píng)論 0 1