用簡(jiǎn)單思維解決LeetCode中困難級(jí)別的題 —— 接雨水問(wèn)題

目錄

之前看面試題的時(shí)候,看到了一個(gè)接雨水的問(wèn)題悠砚,和小黃鴨討論之后,覺(jué)得很有趣呢堂飞,這里和大家分享一下這個(gè)解法灌旧。后來(lái)看到LeetCode上面有這道題,題號(hào)42绰筛,有興趣的可以做一下枢泰。

問(wèn)題描述

給定n個(gè)非負(fù)整數(shù)表示每個(gè)寬度為1的柱子的高度圖,計(jì)算彼此排列的柱子铝噩,下雨之后能接多少雨水衡蚂。

示例1:

輸入:height = [0,1,0,2,1,0,1,3,2,1,2,1]
輸出:6

實(shí)例2:

輸入:height = [4,2,0,3,2,5]
輸出:9

你能不能先思考一下,遇到這種問(wèn)題骏庸,你要怎么做呢?

問(wèn)題分析

首先我們可以根據(jù)給的數(shù)組毛甲,先畫出來(lái)柱子的長(zhǎng)度。

柱子長(zhǎng)度.png

那么我們?cè)趺创_定接的雨水的量呢?當(dāng)然是兩個(gè)都高中間低的地方具被,來(lái)存儲(chǔ)水玻募,下面陰影的部分就是儲(chǔ)存水的位置。

雨水部分.png

那么我們需要對(duì)左邊和右邊最高水位做一個(gè)統(tǒng)計(jì)一姿,這邊使用到了兩個(gè)輔助數(shù)組

一個(gè)用來(lái)儲(chǔ)存左邊的最大接雨水?dāng)?shù)补箍,一個(gè)存儲(chǔ)右邊的最大接雨水?dāng)?shù)。

最大接雨水?dāng)?shù).png

選擇兩個(gè)中最小的那個(gè)作為存儲(chǔ)水的量

QQ圖片20210421181221.png

當(dāng)然還要減去自己柱子的高度啸蜜。剩下的坑雅,就是可以接的雨水了。

QQ圖片20210421181257.png

代碼整理

function trap(height) {
    if(!height.length) return 0;
    let left = []
    let right = []
    let lmax = rmax = 0
    let len = height.length
    let result = 0
    // 把左右最大出水量求出來(lái)
    for(let i = 0; i < len; i++) {
        lmax = Math.max(height[i], lmax)
        rmax = Math.max(height[len-i-1], rmax)
        left[i] = lmax
        right[len- i - 1] = rmax
    }
    // 算出最小的然后累加
    for(let i = 0; i < len; i++) {
        result += Math.min(left[i],right[i]) - height[i]
    }
    return result
};

如果想要寫法上優(yōu)化一下衬横,可以第二次遍歷的時(shí)候可以使用reduce

function trap(height) {
    if(!height.length) return 0;
    let left = []
    let right = []
    let lmax = rmax = 0
    let len = height.length
    for(let i = 0; i < len; i++) {
        lmax = Math.max(height[i], lmax)
        rmax = Math.max(height[len-i-1], rmax)
        left[i] = lmax
        right[len- i - 1] = rmax
    }
    return height.reduce((prev, item, index) => {
        return prev + Math.min(left[index],right[index]) - item
    }, 0)
};

分析

  • 時(shí)間復(fù)雜度O(n)
  • 空間復(fù)雜度O(n)

其實(shí)右邊數(shù)組的值的存儲(chǔ)是可以省略的裹粤,雖然都是空間復(fù)雜度O(n),但是也算小小的優(yōu)化點(diǎn)。

function trap(height) {
    if(!height.length) return 0;
    let left = []
    let lmax = rmax = 0
    let len = height.length
    let result = 0
    for(let i = 0; i < len; i++) {
        lmax = Math.max(height[i], lmax)
        left[i] = lmax
    }
    // 從后往前遍歷
    for(let i = len - 1; i >= 0; i--) {
        rmax = Math.max(height[i], rmax)
        result += Math.min(left[i],rmax) - height[i]
    }
    return result
};
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末遥诉,一起剝皮案震驚了整個(gè)濱河市拇泣,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌矮锈,老刑警劉巖霉翔,帶你破解...
    沈念sama閱讀 218,607評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異苞笨,居然都是意外死亡债朵,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,239評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門瀑凝,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)序芦,“玉大人,你說(shuō)我怎么就攤上這事粤咪⊙柚校” “怎么了?”我有些...
    開封第一講書人閱讀 164,960評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵寥枝,是天一觀的道長(zhǎng)宪塔。 經(jīng)常有香客問(wèn)我,道長(zhǎng)囊拜,這世上最難降的妖魔是什么某筐? 我笑而不...
    開封第一講書人閱讀 58,750評(píng)論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮艾疟,結(jié)果婚禮上来吩,老公的妹妹穿的比我還像新娘。我一直安慰自己蔽莱,他們只是感情好弟疆,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,764評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著盗冷,像睡著了一般怠苔。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上仪糖,一...
    開封第一講書人閱讀 51,604評(píng)論 1 305
  • 那天柑司,我揣著相機(jī)與錄音,去河邊找鬼锅劝。 笑死攒驰,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的故爵。 我是一名探鬼主播玻粪,決...
    沈念sama閱讀 40,347評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了劲室?” 一聲冷哼從身側(cè)響起伦仍,我...
    開封第一講書人閱讀 39,253評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎很洋,沒(méi)想到半個(gè)月后充蓝,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,702評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡喉磁,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,893評(píng)論 3 336
  • 正文 我和宋清朗相戀三年谓苟,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片线定。...
    茶點(diǎn)故事閱讀 40,015評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡娜谊,死狀恐怖确买,靈堂內(nèi)的尸體忽然破棺而出斤讥,到底是詐尸還是另有隱情,我是刑警寧澤湾趾,帶...
    沈念sama閱讀 35,734評(píng)論 5 346
  • 正文 年R本政府宣布芭商,位于F島的核電站,受9級(jí)特大地震影響搀缠,放射性物質(zhì)發(fā)生泄漏铛楣。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,352評(píng)論 3 330
  • 文/蒙蒙 一艺普、第九天 我趴在偏房一處隱蔽的房頂上張望簸州。 院中可真熱鬧,春花似錦歧譬、人聲如沸岸浑。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,934評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)矢洲。三九已至,卻和暖如春缩焦,著一層夾襖步出監(jiān)牢的瞬間读虏,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,052評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工袁滥, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留盖桥,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,216評(píng)論 3 371
  • 正文 我出身青樓题翻,卻偏偏與公主長(zhǎng)得像揩徊,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,969評(píng)論 2 355

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

  • 題目 給定 n 個(gè)非負(fù)整數(shù)表示每個(gè)寬度為 1 的柱子的高度圖靴拱,計(jì)算按此排列的柱子垃喊,下雨之后能接多少雨水。 上面是由...
    suoxd123閱讀 423評(píng)論 0 0
  • 1.問(wèn)題描述 給定 n 個(gè)非負(fù)整數(shù)表示每個(gè)寬度為 1 的柱子的高度圖袜炕,計(jì)算按此排列的柱子本谜,下雨之后能接多少雨水。高...
    不輟居閱讀 694評(píng)論 0 1
  • 【題目】: 給定 n 個(gè)非負(fù)整數(shù)表示每個(gè)寬度為 1 的柱子的高度圖偎窘,計(jì)算按此排列的柱子乌助,下雨之后能接多少雨水。 上...
    myf008閱讀 429評(píng)論 0 0
  • 讀完本文陌知,你可以去力扣拿下如下題目: 42.接雨水[https://leetcode-cn.com/problem...
    labuladong閱讀 686評(píng)論 0 5
  • 給定n個(gè)非負(fù)整數(shù)表示每個(gè)寬度為 1 的柱子的高度圖他托,計(jì)算按此排列的柱子,下雨之后能接多少雨水 https://le...
    Shimmer_閱讀 237評(píng)論 0 1