leetcode.42 接雨水

題目

給定 n 個(gè)非負(fù)整數(shù)表示每個(gè)寬度為 1 的柱子的高度圖懊渡,計(jì)算按此排列的柱子骄呼,下雨之后能接多少雨水苍鲜。


ekR4ns

輸入:height = [0,1,0,2,1,0,1,3,2,1,2,1]
輸出:6
解釋:上面是由數(shù)組 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度圖胸囱,在這種情況下洽瞬,可以接 6 個(gè)單位的雨水(藍(lán)色部分表示雨水)嗡髓。

code

/**
 * @param height
 * @return
 * 當(dāng)前柱子如果小于等于棧頂元素操漠,說(shuō)明形不成凹槽,則將當(dāng)前柱子入棧饿这;反之若當(dāng)前柱子大于棧頂元素浊伙,說(shuō)明形成了凹槽,于是將棧中小于當(dāng)前柱子的元素pop出來(lái)长捧,將凹槽的大小累加到結(jié)果中嚣鄙。
 * https://mp.weixin.qq.com/s/f9ebzbwymR8jQeUDxjeCDA
 */
private static int trap_3(int[] height) {
    Stack<Integer> stack = new Stack<>();
    int size = 0;
    for (int i = 0; i < height.length; i++) {
        while (!stack.isEmpty() && height[stack.peek()] < height[i]) {
            Integer bottom_idx = stack.pop();

            while (!stack.isEmpty() && height[bottom_idx] == height[stack.peek()]) {
                stack.pop();
            }

            if (!stack.isEmpty()) {
                size += (Math.min(height[i], height[stack.peek()]) - height[i]) * (i - stack.peek() - 1);
            }
        }
        stack.push(i);
    }
    return size;
}

private static int trap_2(int[] heights) {
    // dp狀態(tài)轉(zhuǎn)移方程
    // dp[i][0] = max(dp[i - 1][0],cur)
    // dp[i][1] = max(dp[i + 1][1],cur)
    if (heights == null || heights.length == 0) {
        return 0;
    }
    int size = 0;
    int n = heights.length;
    int[][] dp = new int[n][2];

    dp[0][0] = heights[0]; // 保存左邊最大
    dp[n - 1][1] = heights[n - 1]; // 保存右邊最大

    // 計(jì)算左邊最大
    for (int i = 1; i < n; i++) {
        dp[i][0] = Math.max(dp[i - 1][0], heights[i]);
    }

    // 計(jì)算右邊最大
    for (int i = n - 2; i >= 0; i--) {
        dp[i][1] = Math.max(dp[i + 1][1], heights[i]);
    }

    // 遍歷 和trap_1方法相同,求出size串结,即 當(dāng)前柱子左右兩邊最大高度的較小者 - 當(dāng)前柱子的高度哑子。
    for (int i = 0; i < heights.length; i++) {
        size += Math.min(dp[i][0], dp[i][1]) - heights[i];
    }

    return size;
}

/**
 * 每個(gè)柱子頂部可以儲(chǔ)水的高度為:該柱子的左右兩側(cè)最大高度的較小者減去此柱子的高度舅列。
 * 因此我們只需要遍歷每個(gè)柱子,累加每個(gè)柱子可以儲(chǔ)水的高度即可卧蜓。
 *
 * @param heights
 * @return
 */
private static int trap_1(int[] heights) {
    if (heights == null || heights.length == 0) {
        return 0;
    }

    int n = heights.length;
    int size = 0;
    // 遍歷每個(gè)柱子
    for (int i = 1; i < n; i++) {
        int left_max = 0, right_max = 0;
        // 計(jì)算當(dāng)前柱子左側(cè)的柱子中的最大高度
        for (int j = 0; j <= i; j++) {
            left_max = Math.max(left_max, heights[j]);
        }
        // 計(jì)算當(dāng)前柱子右側(cè)的柱子中的最大高度
        for (int j = i; j < n; j++) {
            right_max = Math.max(right_max, heights[j]);
        }
        // 結(jié)果中累加當(dāng)前柱子頂部可以儲(chǔ)水的高度帐要,
        // 即 當(dāng)前柱子左右兩邊最大高度的較小者 - 當(dāng)前柱子的高度。
        size += Math.min(left_max, right_max) - heights[i];
    }
    return size;
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末弥奸,一起剝皮案震驚了整個(gè)濱河市榨惠,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌盛霎,老刑警劉巖赠橙,帶你破解...
    沈念sama閱讀 218,941評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異愤炸,居然都是意外死亡期揪,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門摇幻,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)横侦,“玉大人,你說(shuō)我怎么就攤上這事绰姻⊥鞑啵” “怎么了?”我有些...
    開封第一講書人閱讀 165,345評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵狂芋,是天一觀的道長(zhǎng)榨馁。 經(jīng)常有香客問(wèn)我,道長(zhǎng)帜矾,這世上最難降的妖魔是什么翼虫? 我笑而不...
    開封第一講書人閱讀 58,851評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮屡萤,結(jié)果婚禮上珍剑,老公的妹妹穿的比我還像新娘。我一直安慰自己死陆,他們只是感情好招拙,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,868評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著措译,像睡著了一般别凤。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上领虹,一...
    開封第一講書人閱讀 51,688評(píng)論 1 305
  • 那天规哪,我揣著相機(jī)與錄音,去河邊找鬼塌衰。 笑死诉稍,一個(gè)胖子當(dāng)著我的面吹牛蝠嘉,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播杯巨,決...
    沈念sama閱讀 40,414評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼是晨,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了舔箭?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,319評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤蚊逢,失蹤者是張志新(化名)和其女友劉穎层扶,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體烙荷,經(jīng)...
    沈念sama閱讀 45,775評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡镜会,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了终抽。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片戳表。...
    茶點(diǎn)故事閱讀 40,096評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖昼伴,靈堂內(nèi)的尸體忽然破棺而出匾旭,到底是詐尸還是另有隱情,我是刑警寧澤圃郊,帶...
    沈念sama閱讀 35,789評(píng)論 5 346
  • 正文 年R本政府宣布价涝,位于F島的核電站,受9級(jí)特大地震影響持舆,放射性物質(zhì)發(fā)生泄漏色瘩。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,437評(píng)論 3 331
  • 文/蒙蒙 一逸寓、第九天 我趴在偏房一處隱蔽的房頂上張望居兆。 院中可真熱鬧,春花似錦竹伸、人聲如沸泥栖。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)聊倔。三九已至,卻和暖如春生巡,著一層夾襖步出監(jiān)牢的瞬間耙蔑,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評(píng)論 1 271
  • 我被黑心中介騙來(lái)泰國(guó)打工孤荣, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留甸陌,地道東北人须揣。 一個(gè)月前我還...
    沈念sama閱讀 48,308評(píng)論 3 372
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像钱豁,于是被迫代替她去往敵國(guó)和親耻卡。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,037評(píng)論 2 355

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

  • 題目 給定 n 個(gè)非負(fù)整數(shù)表示每個(gè)寬度為 1 的柱子的高度圖牲尺,計(jì)算按此排列的柱子卵酪,下雨之后能接多少雨水。 如上圖:...
    小杜好機(jī)會(huì)閱讀 333評(píng)論 0 3
  • 題目描述 給定n個(gè)非負(fù)整數(shù)表示每個(gè)寬度為 1 的柱子的高度圖谤碳,計(jì)算按此排列的柱子溃卡,下雨之后能接多少雨水。 上面是由...
    Roman_8e5f閱讀 273評(píng)論 0 0
  • 給定 n 個(gè)非負(fù)整數(shù)表示每個(gè)寬度為 1 的柱子的高度圖蜒简,計(jì)算按此排列的柱子瘸羡,下雨之后能接多少雨水。 上面是由數(shù)組 ...
    huxq_coder閱讀 285評(píng)論 0 1
  • LeetCode 42 接雨水給定 n 個(gè)非負(fù)整數(shù)表示每個(gè)寬度為 1 的柱子的高度圖搓茬,計(jì)算按此排列的柱子犹赖,下雨之后...
    Phelthas閱讀 518評(píng)論 0 0
  • 給定 n 個(gè)非負(fù)整數(shù)表示每個(gè)寬度為 1 的柱子的高度圖,計(jì)算按此排列的柱子卷仑,下雨之后能接多少雨水峻村。 示例 1: 輸...
    刻苦驢噥閱讀 124評(píng)論 0 0