那曲檬骨新材料有限公司

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

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

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

Leetcode上第11號(hào)問(wèn)題:盛最多水的容器

算法與數(shù)據(jù)結(jié)構(gòu) ? 來(lái)源:算法與數(shù)據(jù)結(jié)構(gòu) ? 2020-05-06 10:35 ? 次閱讀

Leetcode 上第 11 號(hào)問(wèn)題:盛最多水的容器,是一道非常經(jīng)典的問(wèn)題。不久前,一個(gè)同學(xué)還告訴我,他去字節(jié)跳動(dòng)面試,考了一模一樣的原題。

這個(gè)問(wèn)題本身很好理解:在坐標(biāo)軸的每個(gè)坐標(biāo)位置都放上了一系列長(zhǎng)度不等的豎板。要求在這些豎板中選出兩塊,這兩塊豎板和坐標(biāo)軸組成了一個(gè)“容器”。這個(gè)容器的底就是這兩塊豎板所在的坐標(biāo)之間的距離;而高則是這兩塊豎板之間的較短者。所謂短板效應(yīng)。

問(wèn)題是希望找到兩塊豎板,使得這個(gè)“容器”的面積最大。

如果總共有 n 塊木板可以選擇的話,我們可以暴力枚舉任意兩塊木板的組合,檢查他們組成的容器面積,一共需要檢查 n * (n - 1) / 2 對(duì)木板的組合。

如果會(huì)排列組合的同學(xué),可以很輕易地使用組合公式得到這個(gè)結(jié)果,即:

C(n, 2) = n * (n - 1) / 2

即使不擅長(zhǎng)排列組合的同學(xué),也可以非常容易地通過(guò)程序來(lái)分析出這個(gè)結(jié)果。我們的暴力枚舉的程序偽碼是這樣的:(其中數(shù)組 a 存儲(chǔ)了 n 個(gè)木板的高度)

res=0; for(i=0;i

在上面的循環(huán)中,res 一共被比較計(jì)算了幾次?

可以想象,當(dāng) i == 0 的時(shí)候,j 的取值范圍是從 1 到 n-1,內(nèi)循環(huán)一共計(jì)算了 n-1 次;

當(dāng) i == 1 的時(shí)候,j 的取值范圍是從 2 到 n-1,內(nèi)循環(huán)一共計(jì)算了 n-2 次;

當(dāng) i == 2 的時(shí)候,j 的取值范圍是從 3 到 n-1,內(nèi)循環(huán)一共計(jì)算了 n-3 次;

以此類推...

i 最大取值為 n - 2,此時(shí) j 的取值為 n-1,內(nèi)循環(huán)只計(jì)算了 1 次。

所以,整體,內(nèi)循環(huán)計(jì)算的次數(shù),就是 1 + 2 + 3 + ... + (n-3) + (n-2) + (n-1)。

這是一個(gè)等差數(shù)列求和,一共 n-1 項(xiàng),首項(xiàng)為 1,末項(xiàng)為 n-1。帶入等差數(shù)列求和公式,就是 n * (n - 1) / 2。

很顯然,這樣暴力枚舉,我們的算法時(shí)間復(fù)雜度是 O(n^2) 級(jí)別的。

實(shí)際上,這個(gè)問(wèn)題有 O(n) 級(jí)別的解法,也就是大名鼎鼎的雙指針解法,思路是這樣的:

首先,使用 left 和 right 兩個(gè)指針,分別指向最左邊的木板 a[0] 和最右邊的木板 a[n-1]。這樣,left 和 right 就構(gòu)成了一個(gè)容器。這個(gè)容器的面積,是我們的初始值。

下一步,我們只需要看 left 對(duì)應(yīng)的木板和 right 對(duì)應(yīng)的木板誰(shuí)小,就好了。如果 left 更小,那么就 left ++,也就是下一步去檢查 a[1] 和 a[n - 1] 組成的容器是否更大?如果 right 更小,那么就 right --,也就是看 a[0] 和 a[n - 2] 組成的容器是否更大?這個(gè)過(guò)程以此類推,如果發(fā)現(xiàn)了更大的容器,就更新結(jié)果。

算法偽碼大概是這樣的:

l=0,r=n-1,res=0; while(l

可以看出來(lái),這個(gè)過(guò)程,或者 left ++,或者 right --,木板之間的距離越來(lái)越小。直到 left 和 right 碰上,也就是兩塊木板重合了,容器的底為 0,此時(shí),算法結(jié)束。

這個(gè)算法的復(fù)雜度是 O(n) 的。因?yàn)檎麄€(gè)算法中,每一個(gè)木板都或者被 left 指針指過(guò)一次,或者被 right 指針指過(guò)一次,直到 left 和 right 匯合。

對(duì)應(yīng)的,res 一共被計(jì)算了 n-1 次。因?yàn)閮蓚€(gè)木板才能形成一個(gè)容器。使用這種方式,n 個(gè)木板,一共組成了 n-1 個(gè)容器。

這個(gè)算法看起來(lái)非常簡(jiǎn)單,但是,一個(gè)很致命的問(wèn)題是:這個(gè)算法為什么是正確的?

一個(gè)直觀的想法是:每次不管是 left 右移,還是 right 左移,容器的底都會(huì)減一。由于容器的底減小了,所以,如果我們要想得到更大的面積,就要讓容器的高變大。整個(gè)容器的高是由最短的木板決定的,所以我們將兩個(gè)木板中最短的那一個(gè)做改變,才有可能得到一個(gè)更大的容器。

這個(gè)解釋模模糊糊說(shuō)得通,但似乎并不是那么嚴(yán)格。關(guān)鍵在于,這個(gè)解釋沒有說(shuō)明:這個(gè)算法為什么沒有漏掉一個(gè)可能的更大面積的容器?

Leetcode 的討論區(qū)有很多關(guān)于這個(gè)算法的正確性的討論,但我覺得大多數(shù)敘述的語(yǔ)言過(guò)于理論化了。也有同學(xué)在我的課程問(wèn)答區(qū)問(wèn)過(guò)我這個(gè)問(wèn)題,所以,我寫了這篇文章,嘗試闡述一下這個(gè)問(wèn)題。

我們來(lái)看初始的時(shí)候,left 指向 a[0],right 指向 a[n-1]。我們假設(shè) a[0] 是小于 a[n-1] 的,即 a[0] < a[n-1]。那么下一步,根據(jù)我們的算法,就是 left ++,即 left 下一步指向了 a[1]。

這意味著什么?這就意味著,使用 a[0] 和 a[n-2];使用 a[0] 和 a[n-3];使用 a[0] 和 a[n-4];.... ;使用 a[0] 和 a[1],這些木板的組合,我們都直接跳過(guò)去了,不去計(jì)算了。

換句話說(shuō),因?yàn)槲覀冎苯?left ++ 了,所以所有的以 a[0] 為左邊木板的其他組合,都不看了。

為什么可以這樣?

還記得我們的假設(shè)嗎?a[0] 是小于 a[n-1] 的。所以,此時(shí),整個(gè)容器的高度,是由 a[0] 決定的。因?yàn)椋绻疫叞宓母叨却笥?a[0],我們?nèi)《贪澹萜鞯母叨冗€是 a[0];如果右邊的高度小于 a[0],那么容器的高度比 a[0] 還要小。

而對(duì)于其他的以 a[0] 為左邊木板的組合:a[0] 和 a[1],a[0] 和 a[2],a[0] 和 a[3],...,a[0] 和 a[n-2],底的長(zhǎng)度都比 a[0] 和 a[n-1] 更小。而高度又不會(huì)超過(guò) a[0],所以,面積一定是更小的,我們就可以直接排除掉!

那么這個(gè)過(guò)程,我們一下子排除了多少組組合呢?答案是,左邊是 a[0],右邊是 a[1] ... a[n-2],一共 n-2 組組合,直接被我們?nèi)拥袅恕?/p>

當(dāng)然,如果我們假設(shè) a[0] > a[n-1],這個(gè)邏輯同樣成立,只不過(guò)我們?nèi)拥舻慕M合,右邊固定為 a[n-1],左邊是 a[1] 到 a[n-2],還是 n-2 個(gè)組合。

現(xiàn)在,假設(shè)我們的 left 指向 1 了,right 還是 n-1。再假設(shè),這次是 a[1] > a[n-1] 了。那么,按照我們的算法,就應(yīng)該是 right-- 了。

這次,有了上面的分析,相信大家就都理解了,我們不需要比較 a[2] 和 a[n-1];a[3] 和 a[n-1];a[4] 和 a[n-1];...;a[n-3] 和 a[n-1],a[n-2] 和 a[n-1],這些組合了。

為什么?因?yàn)榇藭r(shí),a[1] 和 a[n-1] 這個(gè)組合中,容器的高度是由右邊的板 a[n-1] 決定的。那么剩下的以 a[n-1] 為右側(cè)板的所有容器,高度不可能大于 a[n-1] 了,而底卻在縮小,所以,這些組合都可以直接扔掉,不計(jì)算了。

那么這次,我們?nèi)拥袅硕嗌賯€(gè)組合?答案是右邊固定為 a[n - 1],左邊是 a[2], a[3],...,a[n-2],一共 n-3 個(gè)組合!

相信大家可以看出規(guī)律來(lái)了。我們每次左指針或者右指針移動(dòng)一次,其實(shí)都是扔掉了若干組合,不再需要比較了。

第一次移動(dòng),扔掉了 n-2 個(gè)組合;第二次移動(dòng),扔掉了 n-3 個(gè)組合;第三次移動(dòng),將扔掉 n-4 個(gè)組合,依次類推,直到最后一次移動(dòng),扔掉 1 個(gè)組合。

那么,我們?cè)谶@個(gè)過(guò)程中,總共扔掉了多少組合?就是 1, 2, 3, ... , n-4, n-3, n-2 的和。大家可以看出來(lái),這又是一個(gè)等差數(shù)列。首項(xiàng)是 1,末項(xiàng)是 n-2,一共 n-2 項(xiàng)。

帶入等差數(shù)列求和公式,我們一共扔掉了 (n-1)*(n-2)/2 這么多個(gè)組合,不用去考慮。

現(xiàn)在,大家就可以計(jì)算一下了。回憶一下上面的敘述:

我們一共扔掉了 (n-1)*(n-2)/2 這么多組合,只計(jì)算了 n-1 這么多組合。

把他們加起來(lái),是多少?

答案是 n * (n - 1) / 2!

大家回憶一下,這個(gè)數(shù)字正好就是 n 塊木板,抽出兩塊,組成容器的所有可能方案!

C(n, 2) = n * (n - 1) / 2!

那么這也就證明了,我們的雙指針?biāo)惴ǎ容^了 n-1 組木板,扔掉了 (n-1)*(n-2)/2 組木板,合在一起,已經(jīng)完整地考慮了所有 n * (n - 1) / 2 組木板的組合了。

我們這個(gè)過(guò)程,不會(huì)漏掉任何一個(gè)組合,最終找到的解,一定是最優(yōu)解!

怎么樣?是不是覺得這個(gè)證明理解起來(lái)并不難?

值得一提的是,雖然我們說(shuō)這個(gè)問(wèn)題是雙指針的問(wèn)題,但其實(shí),在算法設(shè)計(jì)上,我們使用了貪心的思想。即每次把最短木板對(duì)應(yīng)的所有其余組合都扔掉了。

而對(duì)于貪心算法來(lái)說(shuō),最大的特點(diǎn)就是:通常代碼都會(huì)比較簡(jiǎn)單,但要想證明貪心的正確性,會(huì)比較費(fèi)勁。這個(gè)問(wèn)題就是一個(gè)很好的例子。

實(shí)際上,在 Leetcode 上,還有很多貪心的問(wèn)題,擁有這樣的特點(diǎn)。以后有機(jī)會(huì),可以再向大家介紹。

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

    關(guān)注

    23

    文章

    4630

    瀏覽量

    93364
  • 容器
    +關(guān)注

    關(guān)注

    0

    文章

    499

    瀏覽量

    22125
  • leetcode
    +關(guān)注

    關(guān)注

    0

    文章

    20

    瀏覽量

    2342

原文標(biāo)題:優(yōu)雅地證明 盛水容器問(wèn)題

文章出處:【微信號(hào):TheAlgorithm,微信公眾號(hào):算法與數(shù)據(jù)結(jié)構(gòu)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    投資5億元,高端半導(dǎo)體裝備項(xiàng)目簽約無(wú)錫

    日前,高端半導(dǎo)體裝備項(xiàng)目簽約落地惠山,未來(lái)將入駐即將投用的惠山先進(jìn)制造產(chǎn)業(yè)園,為惠山半導(dǎo)體產(chǎn)業(yè)能級(jí)躍升增添強(qiáng)勁動(dòng)能。
    的頭像 發(fā)表于 01-04 10:43 ?265次閱讀

    鉑科技FlexDDS-NG相參信號(hào)源:量子光學(xué)研究多通道波形發(fā)生器

    鉑科技FlexDDS-NG能夠在單個(gè)機(jī)箱中提供最多12個(gè)獨(dú)立的射頻輸出通道和ADC采集通道,輸出頻率高達(dá)400MHz,滿足了高密度實(shí)驗(yàn)設(shè)置的需求。
    的頭像 發(fā)表于 12-24 13:33 ?300次閱讀
    <b class='flag-5'>盛</b>鉑科技FlexDDS-NG相參信號(hào)源:量子光學(xué)研究多通道波形發(fā)生器

    艾思科榮獲ASPICE 4.0 CL2級(jí)認(rèn)證

    近日,華艾思科公司在軟件開發(fā)及質(zhì)量管控領(lǐng)域取得了重大突破,于2024年11月27日順利通過(guò)了ASPICE 4.0 CL2級(jí)認(rèn)證,并正式獲得了由國(guó)際知名認(rèn)證機(jī)構(gòu)DEKRA德凱頒發(fā)的ASPICE
    的頭像 發(fā)表于 11-29 14:32 ?334次閱讀

    OPA548想輸出最多0~6.5V/(0~3A),如果固定輸入是10V或者11V散熱方面可以嗎?

    有一個(gè)問(wèn)題請(qǐng)教一下,我現(xiàn)在想輸出最多0~6.5V/(0~3A),如果固定輸入是10V或者11V散熱方面可以嗎? 謝謝
    發(fā)表于 09-10 06:54

    昌2024 SNEC上海光伏展回顧

    日前,備受矚目的SNEC PV+第十七屆(2024)國(guó)際太陽(yáng)能光伏與智慧能源(上海)大會(huì)暨展覽會(huì)在國(guó)家會(huì)展中心(上海市崧澤大道333號(hào))盛大舉行。華昌攜旗下光伏系列專業(yè)儀器亮相現(xiàn)場(chǎng)。
    的頭像 發(fā)表于 08-30 11:21 ?462次閱讀

    一款電容型、非接觸式感知的智能浸模組-WS11

    水侵模組 - WS11(Water Sensor-MC11S)是一款電容型、非接觸式感知的智能浸模組,集成了高集成度差分式數(shù)字電容芯片MC11S。
    的頭像 發(fā)表于 08-23 10:15 ?404次閱讀
    一款電容型、非接觸式感知的智能<b class='flag-5'>水</b>浸模組-WS<b class='flag-5'>11</b>

    貼片電容的料號(hào)解析

    貼片電容的料號(hào)(或型號(hào))通常包含了該電容器的關(guān)鍵參數(shù)信息,以便于識(shí)別和使用。以下是對(duì)貼片電容料號(hào)的一般解析方法: 一、料號(hào)的基本結(jié)構(gòu) 貼片電容的料號(hào)
    的頭像 發(fā)表于 08-06 15:43 ?769次閱讀
    貼片電容的料<b class='flag-5'>號(hào)</b>解析

    一面低壓柜最多能放多少臺(tái)電容器

    在電力系統(tǒng)中,低壓柜是一個(gè)至關(guān)重要的設(shè)備,用于保護(hù)、控制和分配電力。而電容器則作為一種具有儲(chǔ)能功能的電氣元件,常用于提高系統(tǒng)的功率因數(shù)、穩(wěn)定電壓等方面。那么,一面低壓柜最多能放多少臺(tái)電容器呢? 一面
    的頭像 發(fā)表于 07-04 14:26 ?696次閱讀
    一面低壓柜<b class='flag-5'>最多</b>能放多少臺(tái)電<b class='flag-5'>容器</b>

    國(guó)激光科技搬廠啦!!!

    ??國(guó)激光科技搬廠啦!!! ? ? ? 2024年6月中旬,國(guó)激光科技從渭南市搬到了咸陽(yáng)市星火大道與紡織四路交叉口西北方向200米高科智造園A28棟。這次搬移不僅是一次物理空間的遷移,更是一次
    的頭像 發(fā)表于 07-03 15:02 ?263次閱讀

    有極性電容器的引腳極性怎么判別?

    由于有極性電容器有正、負(fù)之分,在電路中又不能亂接,所以在使用有極性電容器前需要先判別出正、負(fù)極。有極性電容器的正、負(fù)極判別方法如圖2—9~圖2—11所示。 方法一:對(duì)于未使用過(guò)的新電容
    發(fā)表于 06-05 15:36

    與高通合作發(fā)布航面向智能艙駕融合功能的最新產(chǎn)品

    深圳市航電子股份有限公司(以下簡(jiǎn)稱:航)與高通技術(shù)公司今日在2024北京國(guó)際汽車展覽會(huì)(以下簡(jiǎn)稱:北京車展)發(fā)布航面向智能艙駕融合功能的最新產(chǎn)品。
    的頭像 發(fā)表于 04-28 10:06 ?741次閱讀

    國(guó)際集團(tuán)與洲明科技達(dá)成戰(zhàn)略合作關(guān)系,共推虛擬拍攝創(chuàng)新應(yīng)用

    4月11日,全國(guó)電影(廣州)交易會(huì)暨第25屆全國(guó)優(yōu)秀影片推介會(huì)專場(chǎng)活動(dòng)——廣州增城數(shù)字影視產(chǎn)業(yè)發(fā)展推介會(huì)在寶國(guó)際ICC創(chuàng)新中心圓滿舉辦。
    的頭像 發(fā)表于 04-16 14:19 ?418次閱讀
    寶<b class='flag-5'>盛</b>國(guó)際集團(tuán)與洲明科技達(dá)成戰(zhàn)略合作關(guān)系,共推虛擬拍攝創(chuàng)新應(yīng)用

    探尋未來(lái)科技:超親聚合物超級(jí)電容器

    聚合物超電容,一種新型儲(chǔ)能裝置,以親水性材料構(gòu)筑電容器架構(gòu),具備高效率儲(chǔ)能及快速充放電能力。相較于傳統(tǒng)電池,親聚合物超電容擁有更高能量密度以及更長(zhǎng)使用壽命,堪稱綠色能源存儲(chǔ)的理想選擇。
    的頭像 發(fā)表于 04-12 11:49 ?529次閱讀

    薩里大學(xué)與布里斯托大學(xué)聯(lián)手研發(fā)親聚合物超級(jí)電容器應(yīng)對(duì)氣候變化

    薩里大學(xué)化學(xué)系的研究團(tuán)隊(duì)與Superielectrics有限公司共同合作,將原本用于隱形眼鏡的親聚合物改造為具備電活性的材料,以研發(fā)新型超級(jí)電容器
    的頭像 發(fā)表于 04-12 11:46 ?465次閱讀

    光纜峰是什么意思?

    光纜峰是指在光纖通信中由于光纖與外部環(huán)境發(fā)生的物理變化或損壞,導(dǎo)致光信號(hào)傳輸中出現(xiàn)的信號(hào)衰減或損失的現(xiàn)象。光纜峰可能由多種原因引起,其中一種主要的原因是光纖受到的影響。 光纖通常包裹在保護(hù)層中
    的頭像 發(fā)表于 03-21 10:25 ?805次閱讀
    顶级赌场 官方直营网络赌场| 百家乐注册彩金| 百家乐官网有赢钱公式吗| 大发888真人游戏平台| 圣安娜百家乐官网包杀合作| 皇冠网站| 百家乐那里信誉好| 电子百家乐博彩正网| 百家乐官网赌博技巧论坛| 南部县| 大发888娱乐城官方| 百家乐的桌布| 百家乐官网bp| 百家乐官网开户最快的平台是哪家 | 马尼拉百家乐官网的玩法技巧和规则 | 百家乐官网看大路| 满洲里市| 德州扑克单机版下载| 百家乐官网园云鼎娱乐网| 司法| 财神娱乐城打不开| 威尼斯人娱乐场送1688元礼金领取lrm | 大连娱网棋牌打滚子| 百家乐娱乐场开户注册| 免费百家乐娱乐城| 博彩网百家乐官网的玩法技巧和规则| 百家乐官网是否有路子| 优博娱乐网| 大发888官网黄金版| 362百家乐的玩法技巧和规则| 娱乐城百家乐官网的玩法技巧和规则| 百家乐官网投注信用最好的| 法库县| 皇冠网游戏小说| 顶级赌场下载| 大发888我发财| 金榜百家乐的玩法技巧和规则| 太阳城百家乐如何看路| 基础百家乐官网博牌规| 百家乐官网有公式| 网上百家乐官网的赌博网站|