日B视频 亚洲,啪啪啪网站一区二区,91色情精品久久,日日噜狠狠色综合久,超碰人妻少妇97在线,999青青视频,亚洲一区二卡,让本一区二区视频,日韩网站推荐

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內(nèi)不再提示

接雨水問題的三種解法:暴力/備忘錄/雙指針

算法與數(shù)據(jù)結構 ? 來源:labuladong ? 作者:labuladong ? 2022-05-17 13:24 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

讀完本文,可以去力扣解決如下題目:

42. 接雨水(困難

接雨水這道題目挺有意思,在面試題中出現(xiàn)頻率還挺高的,本文就來步步優(yōu)化,講解一下這道題。

先看一下題目:

5ce42ff0-d594-11ec-bce3-dac502259ad0.png

就是用一個數(shù)組表示一個條形圖,問你這個條形圖最多能接多少水。

inttrap(int[]height);

下面就來由淺入深介紹暴力解法 -> 備忘錄解法 -> 雙指針解法,在 O(N) 時間 O(1) 空間內(nèi)解決這個問題。

一、核心思路

所以對于這種問題,我們不要想整體,而應該去想局部;就像之前的文章寫的動態(tài)規(guī)劃問題處理字符串問題,不要考慮如何處理整個字符串,而是去思考應該如何處理每一個字符。

這么一想,可以發(fā)現(xiàn)這道題的思路其實很簡單。具體來說,僅僅對于位置i,能裝下多少水呢?

5cf77416-d594-11ec-bce3-dac502259ad0.jpg

能裝 2 格水,因為height[i]的高度為 0,而這里最多能盛 2 格水,2-0=2。

為什么位置i最多能盛 2 格水呢?因為,位置i能達到的水柱高度和其左邊的最高柱子、右邊的最高柱子有關,我們分別稱這兩個柱子高度為l_maxr_max;位置 i 最大的水柱高度就是min(l_max, r_max)

更進一步,對于位置i,能夠裝的水為:

water[i]=min(
#左邊最高的柱子
max(height[0..i]),
#右邊最高的柱子
max(height[i..end])
)-height[i]
5d0bebb2-d594-11ec-bce3-dac502259ad0.jpg5d395b42-d594-11ec-bce3-dac502259ad0.jpg

這就是本問題的核心思路,我們可以簡單寫一個暴力算法

inttrap(int[]height){
intn=height.length;
intres=0;
for(inti=1;i1;i++){
intl_max=0,r_max=0;
//找右邊最高的柱子
for(intj=i;j//找左邊最高的柱子
for(intj=i;j>=0;j--)
l_max=Math.max(l_max,height[j]);
//如果自己就是最高的話,
//l_max==r_max==height[i]
res+=Math.min(l_max,r_max)-height[i];
}
returnres;
}

有之前的思路,這個解法應該是很直接粗暴的,時間復雜度 O(N^2),空間復雜度 O(1)。但是很明顯這種計算r_maxl_max的方式非常笨拙,一般的優(yōu)化方法就是備忘錄。

二、備忘錄優(yōu)化

之前的暴力解法,不是在每個位置i都要計算r_maxl_max嗎?我們直接把結果都提前計算出來,別傻不拉幾的每次都遍歷,這時間復雜度不就降下來了嘛。

我們開兩個數(shù)組r_maxl_max充當備忘錄,l_max[i]表示位置i左邊最高的柱子高度,r_max[i]表示位置i右邊最高的柱子高度。預先把這兩個數(shù)組計算好,避免重復計算:

inttrap(int[]height){
if(height.length==0){
return0;
}
intn=height.length;
intres=0;
//數(shù)組充當備忘錄
int[]l_max=newint[n];
int[]r_max=newint[n];
//初始化basecase
l_max[0]=height[0];
r_max[n-1]=height[n-1];
//從左向右計算l_max
for(inti=1;i1]);
//從右向左計算r_max
for(inti=n-2;i>=0;i--)
r_max[i]=Math.max(height[i],r_max[i+1]);
//計算答案
for(inti=1;i1;i++)
res+=Math.min(l_max[i],r_max[i])-height[i];
returnres;
}

這個優(yōu)化其實和暴力解法思路差不多,就是避免了重復計算,把時間復雜度降低為 O(N),已經(jīng)是最優(yōu)了,但是空間復雜度是 O(N)。下面來看一個精妙一些的解法,能夠把空間復雜度降低到 O(1)。

三、雙指針解法

這種解法的思路是完全相同的,但在實現(xiàn)手法上非常巧妙,我們這次也不要用備忘錄提前計算了,而是用雙指針邊走邊算,節(jié)省下空間復雜度。

首先,看一部分代碼:

inttrap(int[]height){
intleft=0,right=height.length-1;
intl_max=0,r_max=0;

while(left//此時 l_max 和 r_max 分別表示什么?
left++;right--;
}
}

對于這部分代碼,請問l_maxr_max分別表示什么意義呢?

很容易理解,l_maxheight[0..left]中最高柱子的高度,r_maxheight[right..end]的最高柱子的高度

明白了這一點,直接看解法:

inttrap(int[]height){
intleft=0,right=height.length-1;
intl_max=0,r_max=0;

intres=0;
while(left//res+=min(l_max,r_max)-height[i]
if(l_maxelse{
res+=r_max-height[right];
right--;
}
}
returnres;
}

你看,其中的核心思想和之前一模一樣,換湯不換藥。但是細心的讀者可能會發(fā)現(xiàn)次解法還是有點細節(jié)差異:

之前的備忘錄解法,l_max[i]r_max[i]分別代表height[0..i]height[i..end]的最高柱子高度。

res+=Math.min(l_max[i],r_max[i])-height[i];
5d4a46d2-d594-11ec-bce3-dac502259ad0.jpg

但是雙指針解法中,l_maxr_max代表的是height[0..left]height[right..end]的最高柱子高度。比如這段代碼:

if(l_max
5d5a2b6a-d594-11ec-bce3-dac502259ad0.jpg

此時的l_maxleft指針左邊的最高柱子,但是r_max并不一定是left指針右邊最高的柱子,這真的可以得到正確答案嗎?

其實這個問題要這么思考,我們只在乎min(l_max, r_max)。對于上圖的情況,我們已經(jīng)知道l_max < r_max了,至于這個r_max是不是右邊最大的,不重要。重要的是height[i]能夠裝的水只和較低的l_max之差有關

5d6901ee-d594-11ec-bce3-dac502259ad0.jpg

這樣,接雨水問題就解決了。

擴展延伸

下面我們看一道和接雨水問題非常類似的題目,力扣第 11 題「盛最多水的容器」:

5d9be2c6-d594-11ec-bce3-dac502259ad0.png

函數(shù)簽名如下:

intmaxArea(int[]height);

這題和接雨水問題很類似,可以完全套用前文的思路,而且還更簡單。兩道題的區(qū)別在于:

接雨水問題給出的類似一幅直方圖,每個橫坐標都有寬度,而本題給出的每個橫坐標是一條豎線,沒有寬度

我們前文討論了半天l_maxr_max,實際上都是為了計算height[i]能夠裝多少水;而本題中height[i]沒有了寬度,那自然就好辦多了。

舉個例子,如果在接雨水問題中,你知道了height[left]height[right]的高度,你能算出leftright之間能夠盛下多少水嗎?

不能,因為你不知道leftright之間每個柱子具體能盛多少水,你得通過每個柱子的l_maxr_max來計算才行。

反過來,就本題而言,你知道了height[left]height[right]的高度,能算出leftright之間能夠盛下多少水嗎?

可以,因為本題中豎線沒有寬度,所以leftright之間能夠盛的水就是:

min(height[left],height[right])*(right-left)

類似接雨水問題,高度是由height[left]height[right]較小的值決定的。

解決這道題的思路依然是雙指針技巧:

leftright兩個指針從兩端向中心收縮,一邊收縮一邊計算[left, right]之間的矩形面積,取最大的面積值即是答案。

先直接看解法代碼吧:

intmaxArea(int[]height){
intleft=0,right=height.length-1;
intres=0;
while(left//[left,right]之間的矩形面積
intcur_area=Math.min(height[left],height[right])*(right-left);
res=Math.max(res,cur_area);
//雙指針技巧,移動較低的一邊
if(height[left]else{
right--;
}
}
returnres;
}

代碼和接雨水問題大致相同,不過肯定有讀者會問,下面這段 if 語句為什么要移動較低的一邊:

//雙指針技巧,移動較低的一邊
if(height[left]else{
right--;
}

其實也好理解,因為矩形的高度是由min(height[left], height[right])即較低的一邊決定的

你如果移動較低的那一邊,那條邊可能會變高,使得矩形的高度變大,進而就「有可能」使得矩形的面積變大;相反,如果你去移動較高的那一邊,矩形的高度是無論如何都不會變大的,所以不可能使矩形的面積變得更大。

至此,這道題也解決了。

原文標題:詳解一道高頻面試題:接雨水

文章出處:【微信公眾號:算法與數(shù)據(jù)結構】歡迎添加關注!文章轉載請注明出處。

審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 代碼
    +關注

    關注

    30

    文章

    4977

    瀏覽量

    74425
  • 數(shù)組
    +關注

    關注

    1

    文章

    420

    瀏覽量

    27483

原文標題:詳解一道高頻面試題:接雨水

文章出處:【微信號:TheAlgorithm,微信公眾號:算法與數(shù)據(jù)結構】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    中科創(chuàng)達與瑞薩電子簽署合作備忘錄

    4月24日-5月3日,2026北京國際汽車展覽會盛大舉辦。開展首日,中科創(chuàng)達與瑞薩電子在展會現(xiàn)場共同簽署合作備忘錄
    的頭像 發(fā)表于 04-30 15:36 ?1234次閱讀

    MediaTek與騰訊云簽署戰(zhàn)略合作備忘錄

    MediaTek 與騰訊云正式簽署戰(zhàn)略合作備忘錄(MOU),宣布將在智能座艙及移動計算領域展開深度合作。雙方將結合 MediaTek 在旗艦移動芯片和邊緣計算領域的深厚技術實力,與騰訊云先進的云計算、人工智能及車載服務領域的深厚積累,共同打造下一代智能座艙與移動融合體驗。
    的頭像 發(fā)表于 04-24 17:16 ?894次閱讀

    東風汽車與康明斯簽署合作備忘錄

    3月18日,東風汽車與康明斯在武漢共慶合作40周年。雙方深情回顧四十載攜手同行、精誠合作的累累碩果,并正式簽署合作備忘錄,宣告全球戰(zhàn)略合作邁入新階段。未來,雙方將致力于為客戶提供更具競爭力的商用車動力解決方案,共同推動行業(yè)高質量發(fā)展與可持續(xù)轉型。
    的頭像 發(fā)表于 03-19 14:27 ?345次閱讀

    長安汽車與寧德時代簽署全面深化戰(zhàn)略伙伴關系備忘錄

    1月14日,中國長安汽車集團有限公司與寧德時代新能源科技股份有限公司簽署《全面深化戰(zhàn)略伙伴關系備忘錄》。重慶市政府副市長鄭向東,中國長安汽車黨委書記、董事長朱華榮,寧德時代董事長曾毓群見證簽約。中國
    的頭像 發(fā)表于 01-15 15:36 ?1786次閱讀

    宏泰科技與ADI正式簽署合作備忘錄

    近日,南京宏泰半導體科技股份有限公司(以下簡稱“宏泰科技”)與全球領先的高性能半導體公司ADI正式簽署合作備忘錄,雙方將在半導體測試與精密信號測量領域展開持續(xù)深度合作,共同推動高性能測試系統(tǒng)的技術創(chuàng)新與市場應用落地。
    的頭像 發(fā)表于 12-02 09:09 ?1729次閱讀

    億緯鋰能與Vimab BESS AB簽署諒解備忘錄

    11月19日,2025年西班牙馬德里能源與環(huán)保展現(xiàn)場,億緯鋰能與瑞典領先的儲能系統(tǒng)集成商Vimab BESS AB正式簽署為期年的諒解備忘錄,攜手共同推動北歐地區(qū)1.48GWh儲能項目的部署,助力歐洲能源轉型。
    的頭像 發(fā)表于 11-27 17:56 ?771次閱讀

    東軟集團與MapmyIndia簽署合作諒解備忘錄

    近日,東軟集團與MapmyIndia簽署合作諒解備忘錄。雙方宣布,將依托各自在軟件技術、數(shù)據(jù)資源等方面的核心優(yōu)勢,開展深度合作。通過技術共研、生態(tài)協(xié)同與資源互補,共同面向東南亞及印度等新興市場,提供
    的頭像 發(fā)表于 11-27 17:50 ?887次閱讀

    思嵐科技與新加坡工藝教育學院及YWY科技簽署合作備忘錄

    近日,思嵐科技(Slamtec)與新加坡工藝教育學院(ITE)、YWY科技共同舉行了一場意義深遠的簽約儀式。方正式簽署為期五年的合作備忘錄,攜手開啟在先進機器人工程領域的校企合作新篇章。
    的頭像 發(fā)表于 11-26 17:03 ?1519次閱讀

    洲明科技與Dimension Studio簽署合作備忘錄

    近日,洲明科技與Dimension Studio、Cambridge Picture Company及北京山慕影視文化傳媒有限公司正式簽署合作備忘錄。
    的頭像 發(fā)表于 09-28 18:20 ?1620次閱讀

    Nullmax與歐洲頂級車企簽署合作備忘錄

    全球自動駕駛智變引領者 Nullmax 今日宣布,與歐洲頂級主機廠正式簽署合作備忘錄(MOU),雙方將圍繞“AI定義汽車”展開深度合作。
    的頭像 發(fā)表于 08-28 17:27 ?1265次閱讀

    格羅方德與現(xiàn)代汽車簽署諒解備忘錄

    日前,格羅方德與現(xiàn)代汽車正式簽署諒解備忘錄,標志著雙方在構建更具韌性、可持續(xù)移動出行生態(tài)領域邁出關鍵一步。
    的頭像 發(fā)表于 08-15 17:42 ?1338次閱讀

    普華基礎軟件與英飛凌簽署合作諒解備忘錄

    近日,普華基礎軟件與英飛凌簽署了合作諒解備忘錄,簽約儀式在普華基礎軟件的上海總部圓滿完成。此次備忘錄的簽約將繼續(xù)深化雙方在汽車底層軟硬件領域的合作與創(chuàng)新?;谟w凌AURIX MCU芯片和普華基礎軟件車用操作系統(tǒng),雙方將打造更安全、更可靠的軟硬件一體化解決方案,助力智能網(wǎng)
    的頭像 發(fā)表于 08-11 09:22 ?2565次閱讀

    云知聲與瓦努阿圖政府簽署諒解備忘錄

    近期,云知聲與瓦努阿圖共和國政府(經(jīng)其駐華大使館代表)(「瓦努阿圖政府」)正式簽署關于人工智能海外實施合作和訪問邀請的諒解備忘錄(「備忘錄」),并將依據(jù)備忘錄開啟緊密戰(zhàn)略合作,展開具體項目的部署。
    的頭像 發(fā)表于 07-18 17:28 ?1352次閱讀

    菱電機與GE Vernova簽署諒解備忘錄

    菱電機集團近日宣布與GE Vernova公司(美國馬薩諸塞州劍橋)簽署諒解備忘錄,強化雙方在高壓直流(HVDC)輸電系統(tǒng)用功率半導體領域的合作。該協(xié)議源于日本經(jīng)濟產(chǎn)業(yè)?。∕ETI)與GE
    的頭像 發(fā)表于 06-13 14:17 ?1188次閱讀

    格羅方德與新加坡科技研究局簽署全新諒解備忘錄

    格羅方德近日宣布,計劃通過與新加坡主要公立研發(fā)機構——新加坡科技研究局(Agency for Science, Technology and Research,以下簡稱“A*STAR”)簽署全新諒解備忘錄,拓展其在先進封裝領域的能力。
    的頭像 發(fā)表于 05-26 10:22 ?1081次閱讀
    颍上县| 万载县| 望谟县| 牙克石市| 澜沧| 琼中| 四子王旗| 郸城县| 广安市| 通榆县| 柘荣县| 连城县| 阿鲁科尔沁旗| 松溪县| 循化| 广平县| 琼中| 成安县| 大丰市| 恩平市| 高平市| 醴陵市| 宁强县| 葫芦岛市| 保靖县| 青海省| 宁陕县| 北辰区| 黄平县| 房山区| 阿荣旗| 凤庆县| 南安市| 安新县| 安远县| 渝中区| 东台市| 闽清县| 定州市| 资阳市| 威远县|