42. Trapping Rain Water

題目

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
.


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. Thanks Marcos for contributing this image!

分析

思路是首先求得每個(gè)位置的水面高度,再由其求得水的體積骗爆。
而求水面高度嘶卧,則可分為兩種情況:

  • 當(dāng)前位置后有大于等于當(dāng)前高度的位置喜爷,則自該位置起,將水面高度賦為當(dāng)前高度
  • 當(dāng)前位置后沒有大于等于當(dāng)前高度的位置了,則自該位置之后,將水面高度賦為其之后的最高高度划栓。

由于這兩種情況都需要用到其后的最大高度,所以可以使用一個(gè)數(shù)組保存該值条获。另外別忘了每個(gè)位置的水面高度不能低于該位置的高度忠荞。

實(shí)現(xiàn)

class Solution {
public:
    int trap(vector<int>& height) {
        if(height.size()<=1) return 0;
        int n = height.size();
        int maxheight[n] = {0};
        int maxpos[n] = {0};
        int water[n] = {0};
        maxheight[n-1] = height[n-1];
        maxpos[n-1] = n-1;
        for(int i=n-2; i>=0; i--){
            if(height[i] >= maxheight[i+1]){
                maxheight[i] = height[i];
                maxpos[i] = i;
            }
            else{
                maxheight[i] = maxheight[i+1];
                maxpos[i] =maxpos[i+1];
            }
        }
        int i=0;
        while(i<n-1){
            if(height[i]>=maxheight[i+1]){
                water[i] = height[i];
                for(int j=i+1; j<=maxpos[i+1]; j++){
                    water[j] = maxheight[i+1];
                }
                i = maxpos[i+1];
            }
            else{
                int tmp = height[i];
                while(i<n && height[i]<=tmp){
                    water[i] = tmp;
                    i++;
                }
                water[i] = height[i];
            }
        }
        int ans = 0;
        for(int i=0; i<n; i++){
            ans += water[i] - height[i];
        }
        return ans;
    }
};

思考

看了題解發(fā)現(xiàn)有更簡(jiǎn)單的思路:

  • 掃描一遍, 找到最高的柱子月匣,該柱子將數(shù)組分成左右兩組
  • 對(duì)于兩組分別處理

參考代碼

class Solution{
  public:
    int trap(const vector<int> &A){
        const int n = A.size();
        int max = 0; //最高的柱子钻洒,將數(shù)組分成兩半
        for (int i = 0; i < n; i++)
            if (A[i] > A[max])
                max = i;
        int water = 0;
        for (int i = 0, peak = 0; i < max; i++)
            if (A[i] > peak)
                peak = A[i];
            else
                water += peak - A[i];
        for (int i = n - 1, top = 0; i > max; i--)
            if (A[i] > top)
                top = A[i];
            else
                water += top - A[i];
        return water;
    }
};
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市锄开,隨后出現(xiàn)的幾起案子素标,更是在濱河造成了極大的恐慌,老刑警劉巖萍悴,帶你破解...
    沈念sama閱讀 221,820評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件头遭,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡癣诱,警方通過查閱死者的電腦和手機(jī)计维,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,648評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來撕予,“玉大人鲫惶,你說我怎么就攤上這事∈德眨” “怎么了欠母?”我有些...
    開封第一講書人閱讀 168,324評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)吆寨。 經(jīng)常有香客問我赏淌,道長(zhǎng),這世上最難降的妖魔是什么啄清? 我笑而不...
    開封第一講書人閱讀 59,714評(píng)論 1 297
  • 正文 為了忘掉前任六水,我火速辦了婚禮,結(jié)果婚禮上辣卒,老公的妹妹穿的比我還像新娘掷贾。我一直安慰自己,他們只是感情好添寺,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,724評(píng)論 6 397
  • 文/花漫 我一把揭開白布胯盯。 她就那樣靜靜地躺著,像睡著了一般计露。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,328評(píng)論 1 310
  • 那天票罐,我揣著相機(jī)與錄音叉趣,去河邊找鬼。 笑死该押,一個(gè)胖子當(dāng)著我的面吹牛疗杉,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播蚕礼,決...
    沈念sama閱讀 40,897評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼烟具,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了奠蹬?” 一聲冷哼從身側(cè)響起朝聋,我...
    開封第一講書人閱讀 39,804評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎囤躁,沒想到半個(gè)月后冀痕,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,345評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡狸演,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,431評(píng)論 3 340
  • 正文 我和宋清朗相戀三年言蛇,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片宵距。...
    茶點(diǎn)故事閱讀 40,561評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡腊尚,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出满哪,到底是詐尸還是另有隱情婿斥,我是刑警寧澤,帶...
    沈念sama閱讀 36,238評(píng)論 5 350
  • 正文 年R本政府宣布翩瓜,位于F島的核電站受扳,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏兔跌。R本人自食惡果不足惜勘高,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,928評(píng)論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望坟桅。 院中可真熱鬧华望,春花似錦、人聲如沸仅乓。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,417評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽夸楣。三九已至宾抓,卻和暖如春子漩,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背石洗。 一陣腳步聲響...
    開封第一講書人閱讀 33,528評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工幢泼, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人讲衫。 一個(gè)月前我還...
    沈念sama閱讀 48,983評(píng)論 3 376
  • 正文 我出身青樓缕棵,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親涉兽。 傳聞我的和親對(duì)象是個(gè)殘疾皇子招驴,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,573評(píng)論 2 359

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