LeetCode習(xí)題:接雨水

題目描述:給定 n 個非負(fù)整數(shù)表示每個寬度為 1 的柱子的高度圖揖盘,計算按此排列的柱子眉厨,下雨之后能接多少雨水。

示例:

image
例1
    輸入: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 個單位的雨水(藍(lán)色部分表示雨水)。 
例2
    輸入:height = [4,2,0,3,2,5]
    輸出:9

提示:

    1. n == height.length
    1. 0 <= n <= 3 * 104
    1. 0 <= height[i] <= 10^5

以下題解思路來源于LeetCode官方題解

解題語言: Swift

題解一:暴力求解

解題思路:直接按問題描述進(jìn)行椭符。對于數(shù)組中的每個元素荔燎,我們找出下雨后水能達(dá)到的最高位置,等于兩邊最大高度的較小值減去當(dāng)前高度的值销钝。

func trap(_ height: [Int]) -> Int {
        if height.count <= 2 {
            return 0
        }
        var ans = 0
        let size = height.count
        for i in 1..<size - 1 {
            var max_left = 0, max_right = 0
            //Search the left part for max bar size
            for j in (0...i).reversed() {
                max_left = max(max_left, height[j])
            }
            // Search the right part for max bar size
            for k in i..<size {
                max_right = max(max_right, height[k])
            }
            ans += min(max_left, max_right) - height[I]
        }
        return ans
    }

復(fù)雜度分析:

時間復(fù)雜度:O(n^2)有咨,數(shù)組中的每個元素都需要向左向右掃描。
空間復(fù)雜度: O(1)的額外空間蒸健。

題解二:動態(tài)規(guī)劃

解題思路:對于下標(biāo) i座享,下雨后水能到達(dá)的最大高度等于下標(biāo) i 兩邊的最大高度的最小值婉商,下標(biāo) i 處能接的雨水量等于下標(biāo) i 處的水能到達(dá)的最大高度減去 height[i]。樸素的做法是對于數(shù)組 height 中的每個元素渣叛,分別向左和向右掃描并記錄左邊和右邊的最大高度丈秩,然后計算每個下標(biāo)位置能接的雨水量。假設(shè)數(shù)組 height 的長度為 n淳衙,該做法需要對每個下標(biāo)位置使用 O(n) 的時間向兩邊掃描并得到最大高度蘑秽,因此總時間復(fù)雜度是 O(n^2)。上述做法的時間復(fù)雜度較高是因?yàn)樾枰獙γ總€下標(biāo)位置都向兩邊掃描箫攀。如果已經(jīng)知道每個位置兩邊的最大高度肠牲,則可以在 O(n) 的時間內(nèi)得到能接的雨水總量。使用動態(tài)規(guī)劃的方法靴跛,可以在 O(n) 的時間內(nèi)預(yù)處理得到每個位置兩邊的最大高度缀雳。創(chuàng)建兩個長度為 n 的數(shù)組 leftMax 和 rightMax。對于 0≤i<n梢睛,leftMax[i] 表示下標(biāo) i 及其左邊的位置中肥印,height 的最大高度, rightMax[i] 表示下標(biāo) i 及其右邊的位置中,height 的最大高度扬绪。顯然竖独,leftMax[0]=height[0],rightMax[n?1]=height[n?1]挤牛。兩個數(shù)組的其余元素的計算如下:當(dāng) 1≤i≤n?1 時莹痢,leftMax[i]=max(leftMax[i?1],height[i]);當(dāng) 0≤i≤n?2 時墓赴,rightMax[i]=max(rightMax[i+1],height[i])竞膳。因此可以正向遍歷數(shù)組 height 得到數(shù)組 leftMax 的每個元素值,反向遍歷數(shù)組 height 得到數(shù)組 rightMax 的每個元素值诫硕。在得到數(shù)組 leftMax 和 rightMax 的每個元素值之后坦辟,對于 0≤i<n,下標(biāo) i 處能接的雨水量等于 min(leftMax[i],rightMax[i])?height[i]章办。遍歷每個下標(biāo)位置即可得到能接的雨水總量锉走。

動態(tài)規(guī)劃做法可以由下圖體現(xiàn)。

image
class Solution {
    func trap(_ height: [Int]) -> Int {
        if height.count <= 2 {
            return 0
        }
        let size = height.count
        var leftMax = [Int](repeating: -1, count: size)
        leftMax[0] = height[0];
        for i in 1..<size {
            leftMax[i] = max(leftMax[i - 1], height[I]);
        }
        
        var rightMax = [Int](repeating: -1, count: size)
        rightMax[size - 1] = height[size - 1];
        for j in (0...size-2).reversed() {
            rightMax[j] = max(rightMax[j + 1], height[j]);
        }
        
        var ans = 0
        for i in 0..<size {
            ans += min(leftMax[i], rightMax[i]) - height[I];
        }
        return ans
    }
}

復(fù)雜度分析:

時間復(fù)雜度:O(n)藕届,其中 n 是數(shù)組 height 的長度挪蹭。計算數(shù)組 leftMax 和 rightMax 的元素值各需要遍歷數(shù)組 height 一次,計算能接的雨水總量還需要遍歷一次休偶。
空間復(fù)雜度:O(n)梁厉,其中 n 是數(shù)組 height 的長度。需要創(chuàng)建兩個長度為 n 的數(shù)組 leftMax 和 rightMax踏兜。
題目來源:LeetCode
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末词顾,一起剝皮案震驚了整個濱河市八秃,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌肉盹,老刑警劉巖昔驱,帶你破解...
    沈念sama閱讀 218,284評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異垮媒,居然都是意外死亡舍悯,警方通過查閱死者的電腦和手機(jī)航棱,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評論 3 395
  • 文/潘曉璐 我一進(jìn)店門睡雇,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人饮醇,你說我怎么就攤上這事它抱。” “怎么了朴艰?”我有些...
    開封第一講書人閱讀 164,614評論 0 354
  • 文/不壞的土叔 我叫張陵观蓄,是天一觀的道長。 經(jīng)常有香客問我祠墅,道長侮穿,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,671評論 1 293
  • 正文 為了忘掉前任毁嗦,我火速辦了婚禮亲茅,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘狗准。我一直安慰自己克锣,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,699評論 6 392
  • 文/花漫 我一把揭開白布腔长。 她就那樣靜靜地躺著袭祟,像睡著了一般。 火紅的嫁衣襯著肌膚如雪捞附。 梳的紋絲不亂的頭發(fā)上巾乳,一...
    開封第一講書人閱讀 51,562評論 1 305
  • 那天胚泌,我揣著相機(jī)與錄音悲关,去河邊找鬼。 笑死吁系,一個胖子當(dāng)著我的面吹牛药版,可吹牛的內(nèi)容都是我干的辑舷。 我是一名探鬼主播,決...
    沈念sama閱讀 40,309評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼槽片,長吁一口氣:“原來是場噩夢啊……” “哼何缓!你這毒婦竟也來了肢础?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,223評論 0 276
  • 序言:老撾萬榮一對情侶失蹤碌廓,失蹤者是張志新(化名)和其女友劉穎传轰,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體谷婆,經(jīng)...
    沈念sama閱讀 45,668評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡慨蛙,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,859評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了纪挎。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片期贫。...
    茶點(diǎn)故事閱讀 39,981評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖异袄,靈堂內(nèi)的尸體忽然破棺而出通砍,到底是詐尸還是另有隱情,我是刑警寧澤烤蜕,帶...
    沈念sama閱讀 35,705評論 5 347
  • 正文 年R本政府宣布封孙,位于F島的核電站,受9級特大地震影響讽营,放射性物質(zhì)發(fā)生泄漏虎忌。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,310評論 3 330
  • 文/蒙蒙 一橱鹏、第九天 我趴在偏房一處隱蔽的房頂上張望膜蠢。 院中可真熱鬧,春花似錦蚀瘸、人聲如沸狡蝶。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,904評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽贪惹。三九已至,卻和暖如春寂嘉,著一層夾襖步出監(jiān)牢的瞬間奏瞬,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,023評論 1 270
  • 我被黑心中介騙來泰國打工泉孩, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留硼端,地道東北人。 一個月前我還...
    沈念sama閱讀 48,146評論 3 370
  • 正文 我出身青樓寓搬,卻偏偏與公主長得像珍昨,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,933評論 2 355

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