色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
电子发烧友
开通电子发烧友VIP会员 尊享10大特权
海量资料免费下载
精品直播免费看
优质内容免费畅学
课程9折专享价
創作中心

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

3天內不再提示

Leetcode上第11號問題:盛最多水的容器

算法與數據結構 ? 來源:算法與數據結構 ? 2020-05-06 10:35 ? 次閱讀

Leetcode 上第 11 號問題:盛最多水的容器,是一道非常經典的問題。不久前,一個同學還告訴我,他去字節跳動面試,考了一模一樣的原題。

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

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

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

如果會排列組合的同學,可以很輕易地使用組合公式得到這個結果,即:

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

即使不擅長排列組合的同學,也可以非常容易地通過程序來分析出這個結果。我們的暴力枚舉的程序偽碼是這樣的:(其中數組 a 存儲了 n 個木板的高度)

res=0; for(i=0;i

在上面的循環中,res 一共被比較計算了幾次?

可以想象,當 i == 0 的時候,j 的取值范圍是從 1 到 n-1,內循環一共計算了 n-1 次;

當 i == 1 的時候,j 的取值范圍是從 2 到 n-1,內循環一共計算了 n-2 次;

當 i == 2 的時候,j 的取值范圍是從 3 到 n-1,內循環一共計算了 n-3 次;

以此類推...

i 最大取值為 n - 2,此時 j 的取值為 n-1,內循環只計算了 1 次。

所以,整體,內循環計算的次數,就是 1 + 2 + 3 + ... + (n-3) + (n-2) + (n-1)。

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

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

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

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

下一步,我們只需要看 left 對應的木板和 right 對應的木板誰小,就好了。如果 left 更小,那么就 left ++,也就是下一步去檢查 a[1] 和 a[n - 1] 組成的容器是否更大?如果 right 更小,那么就 right --,也就是看 a[0] 和 a[n - 2] 組成的容器是否更大?這個過程以此類推,如果發現了更大的容器,就更新結果。

算法偽碼大概是這樣的:

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

可以看出來,這個過程,或者 left ++,或者 right --,木板之間的距離越來越小。直到 left 和 right 碰上,也就是兩塊木板重合了,容器的底為 0,此時,算法結束。

這個算法的復雜度是 O(n) 的。因為整個算法中,每一個木板都或者被 left 指針指過一次,或者被 right 指針指過一次,直到 left 和 right 匯合。

對應的,res 一共被計算了 n-1 次。因為兩個木板才能形成一個容器。使用這種方式,n 個木板,一共組成了 n-1 個容器。

這個算法看起來非常簡單,但是,一個很致命的問題是:這個算法為什么是正確的?

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

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

Leetcode 的討論區有很多關于這個算法的正確性的討論,但我覺得大多數敘述的語言過于理論化了。也有同學在我的課程問答區問過我這個問題,所以,我寫了這篇文章,嘗試闡述一下這個問題。

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

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

換句話說,因為我們直接 left ++ 了,所以所有的以 a[0] 為左邊木板的其他組合,都不看了。

為什么可以這樣?

還記得我們的假設嗎?a[0] 是小于 a[n-1] 的。所以,此時,整個容器的高度,是由 a[0] 決定的。因為,如果右邊板的高度大于 a[0],我們取短板,容器的高度還是 a[0];如果右邊的高度小于 a[0],那么容器的高度比 a[0] 還要小。

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

那么這個過程,我們一下子排除了多少組組合呢?答案是,左邊是 a[0],右邊是 a[1] ... a[n-2],一共 n-2 組組合,直接被我們扔掉了。

當然,如果我們假設 a[0] > a[n-1],這個邏輯同樣成立,只不過我們扔掉的組合,右邊固定為 a[n-1],左邊是 a[1] 到 a[n-2],還是 n-2 個組合。

現在,假設我們的 left 指向 1 了,right 還是 n-1。再假設,這次是 a[1] > a[n-1] 了。那么,按照我們的算法,就應該是 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],這些組合了。

為什么?因為此時,a[1] 和 a[n-1] 這個組合中,容器的高度是由右邊的板 a[n-1] 決定的。那么剩下的以 a[n-1] 為右側板的所有容器,高度不可能大于 a[n-1] 了,而底卻在縮小,所以,這些組合都可以直接扔掉,不計算了。

那么這次,我們扔掉了多少個組合?答案是右邊固定為 a[n - 1],左邊是 a[2], a[3],...,a[n-2],一共 n-3 個組合!

相信大家可以看出規律來了。我們每次左指針或者右指針移動一次,其實都是扔掉了若干組合,不再需要比較了。

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

那么,我們在這個過程中,總共扔掉了多少組合?就是 1, 2, 3, ... , n-4, n-3, n-2 的和。大家可以看出來,這又是一個等差數列。首項是 1,末項是 n-2,一共 n-2 項。

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

現在,大家就可以計算一下了。回憶一下上面的敘述:

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

把他們加起來,是多少?

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

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

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

那么這也就證明了,我們的雙指針算法,比較了 n-1 組木板,扔掉了 (n-1)*(n-2)/2 組木板,合在一起,已經完整地考慮了所有 n * (n - 1) / 2 組木板的組合了。

我們這個過程,不會漏掉任何一個組合,最終找到的解,一定是最優解!

怎么樣?是不是覺得這個證明理解起來并不難?

值得一提的是,雖然我們說這個問題是雙指針的問題,但其實,在算法設計上,我們使用了貪心的思想。即每次把最短木板對應的所有其余組合都扔掉了。

而對于貪心算法來說,最大的特點就是:通常代碼都會比較簡單,但要想證明貪心的正確性,會比較費勁。這個問題就是一個很好的例子。

實際上,在 Leetcode 上,還有很多貪心的問題,擁有這樣的特點。以后有機會,可以再向大家介紹。

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

    關注

    23

    文章

    4697

    瀏覽量

    94706
  • 容器
    +關注

    關注

    0

    文章

    507

    瀏覽量

    22362
  • leetcode
    +關注

    關注

    0

    文章

    20

    瀏覽量

    2428

原文標題:優雅地證明 盛水容器問題

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

收藏 0人收藏

    評論

    相關推薦
    熱點推薦

    查看an70707文檔,為什么它的指導電源電容器使用0.01uf和0.1uf的電容器

    (C11) 0.01 μF 和 0.1 μF 閱讀指南文檔后,我認為一定有一些重要的原因,但是當我查看SuperSpeed_Explorer_Kit的bom文件時,它使用了公差為10%的電容器。 從我的角度來看,使用兩個電容器
    發表于 05-14 08:26

    【重磅喜訊】再獲國家認可!賽檢測通過CNAS復評審

    (CNAS)委托評審專家現場評審,賽檢測現有的127個檢測標準(方法),全部通過復評評審,還推薦了申請變更的11個(其中,電磁兼容7個,可靠性4個)檢測標準(方法
    的頭像 發表于 03-21 17:40 ?465次閱讀
    【重磅喜訊】再獲國家認可!賽<b class='flag-5'>盛</b>檢測通過CNAS復評審

    投資5億元,高端半導體裝備項目簽約無錫

    日前,高端半導體裝備項目簽約落地惠山,未來將入駐即將投用的惠山先進制造產業園,為惠山半導體產業能級躍升增添強勁動能。
    的頭像 發表于 01-04 10:43 ?1075次閱讀

    鉑科技FlexDDS-NG相參信號源:量子光學研究多通道波形發生器

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

    艾思科榮獲ASPICE 4.0 CL2級認證

    近日,華艾思科公司在軟件開發及質量管控領域取得了重大突破,于2024年11月27日順利通過了ASPICE 4.0 CL2級認證,并正式獲得了由國際知名認證機構DEKRA德凱頒發的ASPICE
    的頭像 發表于 11-29 14:32 ?659次閱讀

    昌即將亮相2024 CHINTERGEO展覽會

    2024年11月6 - 8日,備受矚目的CHINTERGEO 2024 中國測繪地理信息技術裝備展覽會(以下簡稱:CHINTERGEO展覽會)將在湖北武漢光谷科技會展中心盛大舉行。在這場行業盛會中,華昌將攜其創新產品與技術精彩亮相展會現場,展位號為 A115。
    的頭像 發表于 11-04 13:54 ?550次閱讀

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

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

    昌2024 SNEC上海光伏展回顧

    日前,備受矚目的SNEC PV+第十七屆(2024)國際太陽能光伏與智慧能源(上海)大會暨展覽會在國家會展中心(上海市崧澤大道333)盛大舉行。華昌攜旗下光伏系列專業儀器亮相現場。
    的頭像 發表于 08-30 11:21 ?617次閱讀

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

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

    江西省政府副省長夏文勇蒞臨永豐航調研

    日前,江西省政府副省長夏文勇在永豐縣調研期間,走進航集團旗下永豐航電子有限公司(以下簡稱:永豐航)考察企業數字化轉型情況。
    的頭像 發表于 08-19 11:32 ?2051次閱讀

    貼片電容的料解析

    貼片電容的料(或型號)通常包含了該電容器的關鍵參數信息,以便于識別和使用。以下是對貼片電容料的一般解析方法: 一、料的基本結構 貼片電容的料
    的頭像 發表于 08-06 15:43 ?1158次閱讀
    貼片電容的料<b class='flag-5'>號</b>解析

    榮獲HUAWEI HiCar卓越合作伙伴獎

    近日,華為開發者大會(HDC.2024)在東莞松山湖舉行,航受邀出席HUAWEI HiCar智慧出行峰會。會上,航憑借在HUAWEI Hicar平臺上卓越的產品開發能力和突出的生態建設貢獻,獲頒“2024 HUAWEI HiCar卓越合作伙伴”獎。
    的頭像 發表于 07-25 17:47 ?1055次閱讀

    一面低壓柜最多能放多少臺電容器

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

    激光科技搬廠啦!!!

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

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

    由于有極性電容器有正、負之分,在電路中又不能亂接,所以在使用有極性電容器前需要先判別出正、負極。有極性電容器的正、負極判別方法如圖2—9~圖2—11所示。 方法一:對于未使用過的新電容
    發表于 06-05 15:36
    主站蜘蛛池模板: 国产欧美另类久久久精品免费 | 羞羞麻豆国产精品1区2区3区 | 99视频免费在线观看 | 久久青青草原精品国产软件 | 久久伊人天堂视频网 | 国产色偷偷男人的天堂 | 红豆视频免费资源观看 | 亚洲欧美高清在线精品一区 | 国产激情精品久久久久久碰 | 3d在线看小舞被躁视频 | 免费看黄色小说 | 免费夜里18款禁用软粉色 | 啪啪漫画无遮挡全彩h网站 啪啪漫画无遮挡全彩h同人 | videossexotv极度另类 | 制服国产欧美亚洲日韩 | 国产亚洲福利精品一区 | 免费人成网站永久 | 久久精品国产亚洲AV妓女不卡 | 日韩一区二区三区四区区区 | 草草色 | 青柠电影高清在线观看 | 狠狠色综合久久丁香婷婷 | 国产精品色欲AV亚洲三区软件 | 亚洲国产成人私人影院 | 手机看片一区二区 | 中文字幕亚洲无线码一区 | 外国xxxx | 久久99这里只有精品 | 男男h啪肉np文总受 男男h开荤粗肉h文1v1 | 99re.05久久热最新地址 | 动漫美女的阴 | 2022年国产精品久久久久 | 久久精品国产欧美成人 | 婷婷亚洲AV色香蕉蜜桃 | 国产精品资源网站在线观看 | 久久婷婷丁香五月色综合啪免费 | 99热婷婷国产精品综合 | 精品国产露脸久久AV麻豆 | 亚洲人成在线播放网站岛国 | 人妻体体内射精一区二区 | 国产三级影院 |

    電子發燒友

    中國電子工程師最喜歡的網站

    • 2931785位工程師會員交流學習
    • 獲取您個性化的科技前沿技術信息
    • 參加活動獲取豐厚的禮品