[LeetCode][DP] Trapping Rain Water

Problem

Given n non-negative integers representing an elevation map where the width of each bar is 1, compute how much water it is able to trap after raining.

For example,
Given [0,1,0,2,1,0,1,3,2,1,2,1], return 6.

Water

The above elevation map is represented by array [0,1,0,2,1,0,1,3,2,1,2,1]. In this case, 6 units of rain water (blue section) are being trapped.

Solution

用兩個(gè)數(shù)組愈污,維護(hù)從左邊到當(dāng)前的元素最大高度,另外一個(gè)是從右邊到當(dāng)前元素的最大高度。當(dāng)前元素的積水高度就取決于左右兩邊的較小值 - 當(dāng)前元素高度。

Swift

class Solution {
  func trap(height: [Int]) -> Int {
    if height.count == 0 {
      return 0
    }
    var leftMax: [Int] = []
    var rightMax: [Int] = []
    var maxH = -1
    for h in height {
      leftMax.append(maxH)
      maxH = max(maxH, h)
    }
    maxH = -1
    for h in height.reverse() {
      rightMax.insert(maxH, atIndex: 0)
      maxH = max(maxH, h)
    }
    
    var ret : Int = 0
    for i in 0..<leftMax.count {
      let h = min(leftMax[i], rightMax[i])
      let water = max(0, h - height[i])
      ret += water
    }
    
    return ret
  }
}

另一種思路:Time: O(n), Space: O(1)
維護(hù)左右兩個(gè)指針,然后朝里推進(jìn)丘侠。于此同時(shí),維護(hù)左右兩邊的最大高度。如果左邊的較小缺亮,左邊指針向右推進(jìn),然后根據(jù)左右兩邊最小的高度確定當(dāng)前格子可以存多少水桥言。這里的關(guān)鍵是萌踱,將左右兩邊更小的那個(gè)指針向里推進(jìn),有點(diǎn)像非遞減序列地去填水号阿。

Swift

class Solution {
  func trap(height: [Int]) -> Int {
    if height.count == 0 {
      return 0
    }
    var i = 0
    var j = height.count - 1
    var ret = 0
    var leftHeight = height[0]
    var rightHeight = height[j]
    while i < j {
      let minHeight = min(leftHeight, rightHeight)
      if (leftHeight < rightHeight) {
        i += 1
        let water = max(minHeight - height[i], 0)
        ret += water
        leftHeight = max(leftHeight, height[i])
      } else {
        j -= 1
        let water = max(minHeight - height[j], 0)
        ret += water
        rightHeight = max(rightHeight, height[i])
      }
    }
    
    return ret
  }
}

C++

class Solution {
public:
    /**
     * @param heights: a vector of integers
     * @return: a integer
     */
    int trapRainWater(vector<int> &heights) {
        if (heights.size() == 0) {
            return 0;
        }
        int i = 0;
        int j = heights.size() - 1;
        int leftHeight = heights[i];
        int rightHeight = heights[j];
        int ret = 0;
        while (i < j) {
            int minHeight = min(leftHeight, rightHeight);
            if (leftHeight < rightHeight) {
                i++;
                int water = max(minHeight - heights[i], 0);
                ret += water;
                leftHeight = max(leftHeight, heights[i]);
            } else {
                j--;
                int water = max(minHeight - heights[j], 0);
                ret += water;
                rightHeight = max(rightHeight, heights[j]);
            }
        }
        return ret;
    }
};
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末并鸵,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子扔涧,更是在濱河造成了極大的恐慌园担,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,682評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件枯夜,死亡現(xiàn)場(chǎng)離奇詭異弯汰,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)湖雹,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門咏闪,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人摔吏,你說我怎么就攤上這事鸽嫂∽葑埃” “怎么了?”我有些...
    開封第一講書人閱讀 165,083評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵溪胶,是天一觀的道長(zhǎng)搂擦。 經(jīng)常有香客問我,道長(zhǎng)哗脖,這世上最難降的妖魔是什么瀑踢? 我笑而不...
    開封第一講書人閱讀 58,763評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮才避,結(jié)果婚禮上橱夭,老公的妹妹穿的比我還像新娘。我一直安慰自己桑逝,他們只是感情好棘劣,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,785評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著楞遏,像睡著了一般茬暇。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上寡喝,一...
    開封第一講書人閱讀 51,624評(píng)論 1 305
  • 那天糙俗,我揣著相機(jī)與錄音,去河邊找鬼预鬓。 笑死巧骚,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的格二。 我是一名探鬼主播劈彪,決...
    沈念sama閱讀 40,358評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼顶猜!你這毒婦竟也來了沧奴?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,261評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤长窄,失蹤者是張志新(化名)和其女友劉穎扼仲,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體抄淑,經(jīng)...
    沈念sama閱讀 45,722評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡屠凶,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了肆资。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片矗愧。...
    茶點(diǎn)故事閱讀 40,030評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出唉韭,到底是詐尸還是另有隱情夜涕,我是刑警寧澤,帶...
    沈念sama閱讀 35,737評(píng)論 5 346
  • 正文 年R本政府宣布属愤,位于F島的核電站女器,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏住诸。R本人自食惡果不足惜驾胆,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,360評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望贱呐。 院中可真熱鬧丧诺,春花似錦、人聲如沸奄薇。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,941評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)馁蒂。三九已至呵晚,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間沫屡,已是汗流浹背劣纲。 一陣腳步聲響...
    開封第一講書人閱讀 33,057評(píng)論 1 270
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留谁鳍,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,237評(píng)論 3 371
  • 正文 我出身青樓劫瞳,卻偏偏與公主長(zhǎng)得像倘潜,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子志于,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,976評(píng)論 2 355

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

  • 背景 一年多以前我在知乎上答了有關(guān)LeetCode的問題, 分享了一些自己做題目的經(jīng)驗(yàn)涮因。 張土汪:刷leetcod...
    土汪閱讀 12,745評(píng)論 0 33
  • 指針是C語(yǔ)言中廣泛使用的一種數(shù)據(jù)類型。 運(yùn)用指針編程是C語(yǔ)言最主要的風(fēng)格之一伺绽。利用指針變量可以表示各種數(shù)據(jù)結(jié)構(gòu)养泡; ...
    朱森閱讀 3,446評(píng)論 3 44
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,162評(píng)論 25 707
  • 問答題47 /72 常見瀏覽器兼容性問題與解決方案? 參考答案 (1)瀏覽器兼容問題一:不同瀏覽器的標(biāo)簽?zāi)J(rèn)的外補(bǔ)...
    _Yfling閱讀 13,754評(píng)論 1 92
  • 2017年4月28日 農(nóng)歷四月初三 星期五 晴 【早睡早起】 昨晚10:30睡奈应,今早5:00起床澜掩。 【學(xué)佛】 1...
    陳境墨閱讀 689評(píng)論 0 0