吴忠躺衫网络科技有限公司

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

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

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

盛最多水的容器:雙指針的經(jīng)典題目

算法與數(shù)據(jù)結(jié)構(gòu) ? 來源:吳師兄學(xué)算法 ? 作者:吳師兄學(xué)算法 ? 2022-07-28 11:25 ? 次閱讀

大家好,我是吳師兄,

今天的題目來源于 LeetCode 第 11 號問題:盛最多水的容器,難度為「中等」,屬于雙指針的經(jīng)典題目

一、題目描述

給你 n 個非負整數(shù) a1,a2,...,an,每個數(shù)代表坐標中的一個點 (i, ai) 。在坐標內(nèi)畫 n 條垂直線,垂直線 i 的兩個端點分別為 (i, ai) 和 (i, 0) 。

找出其中的兩條線,使得它們與 x 軸共同構(gòu)成的容器可以容納最多的水。

二、題目解析

一開始,我們先去考慮相距最遠的兩個柱子所能容納水的面積。

79f574dc-0e24-11ed-ba43-dac502259ad0.jpg

接下來去思考,我們?nèi)ヒ苿幽母訒雍线m?

這里我們需要注意一點:無論移動哪根柱子,柱子之間的寬度都是變小的

移動右邊那根更高的柱子?

7a146cc0-0e24-11ed-ba43-dac502259ad0.jpg7a20b4a8-0e24-11ed-ba43-dac502259ad0.jpg

由于水面高度是由最短的柱子決定的,所以移動右邊那根更高的柱子的時候,水面高度一定是不會增加,甚至有可能遇到更短的柱子而變小,而寬度有一定再減少,所以水的面積也一定減少

移動左邊那根更短的柱子?

這時候,水的高度是不確定的,那么面積也是不確定的,有可能比之前更大,也有可能更小或者相等。

所以,我們可以得出一個結(jié)論:移動兩根柱子之間更短的那根柱子,才有可能在寬度一定變小的情況下,找到一個更高的水面,從而使得面積有可能更大

那接下來這道題目的解法也就有了:

1、設(shè)置兩個索引,分別指向容器的兩側(cè),即索引left指向最左邊的柱子,索引right指向最右邊的柱子。

7a3639ea-0e24-11ed-ba43-dac502259ad0.jpg

2、記錄下此時的水的面積,可以定義為 res

3、觀察需要向內(nèi)移動哪根柱子

  • 1)如果移動較高的柱子,由于水的寬度在變小,而水的高度一定不會增加,所以最終水的面積不會超過之前記錄的水的面積 res
  • 2)所以,只能移動較短的柱子,然后計算此時水的面積,再與之前記錄的水的面積 res 進行比較,保存那個更大的值

4、再去判斷應(yīng)該向內(nèi)移動哪根柱子

5、直到leftright相遇為止

三、參考代碼

1、Java 代碼

//登錄AlgoMooc官網(wǎng)獲取更多算法圖解
//https://www.algomooc.com/587.html
//作者:程序員吳師兄
//代碼有看不懂的地方一定要私聊咨詢吳師兄呀
//盛最多水的容器(LeetCode11):https://leetcode-cn.com/problems/container-with-most-water/
classSolution{
publicintmaxArea(int[]height){

//設(shè)置兩個索引,分別指向容器的兩側(cè)

//索引left指向最左邊的柱子
intleft=0;

//索引right指向最右邊的柱子
intright=height.length-1;

//設(shè)置一個變量用來保存當下水的最大面積
intres=0;

//移動left和right,直到left和right相遇為止
while(left//水的寬度是right-left
intwidth=right-left;

//水的高度由兩根柱子最短的那根決定
inth=Math.min(height[left],height[right]);

//計算此時水的面積
intarea=width*h;

//如果此時水的面積大于了我們之前保存的那個值,我們需要更新一下
if(area>=res){
//更新res的值為area,確保res一直都是最大的值
res=area;
}

//接下來去觀察需要移動哪根柱子:必定是最短的那根柱子

//如果左邊的柱子更短,那么向內(nèi)移動左邊的柱子,因為只有這樣,才有可能找到一個更高的水面
//在寬度一定變小的情況下,水的面積才有可能增大
if(height[left]//向內(nèi)移動左邊的柱子
left++;

//如果右邊的柱子更短,那么向內(nèi)移動右邊的柱子,因為只有這樣,才有可能找到一個更高的水面
//在寬度一定變小的情況下,水的面積才有可能增大
}else{
//向內(nèi)移動右邊的柱子
right--;
}

}

//最后返回最大的面積res即可
returnres;
}
}

2、C++ 代碼

//登錄AlgoMooc官網(wǎng)獲取更多算法圖解
//https://www.algomooc.com/587.html
//作者:程序員吳師兄
//代碼有看不懂的地方一定要私聊咨詢吳師兄呀
//盛最多水的容器(LeetCode11):https://leetcode-cn.com/problems/container-with-most-water/
classSolution{
public:
intmaxArea(vector<int>&height){
//設(shè)置兩個索引,分別指向容器的兩側(cè)

//索引left指向最左邊的柱子
intleft=0;

//索引right指向最右邊的柱子
intright=height.size()-1;

//設(shè)置一個變量用來保存當下水的最大面積
intres=0;

//移動left和right,直到left和right相遇為止
while(left//水的寬度是right-left
intwidth=right-left;

//水的高度由兩根柱子最短的那根決定
inth=min(height[left],height[right]);

//計算此時水的面積
intarea=width*h;

//如果此時水的面積大于了我們之前保存的那個值,我們需要更新一下
if(area>=res){
//更新res的值為area,確保res一直都是最大的值
res=area;
}

//接下來去觀察需要移動哪根柱子:必定是最短的那根柱子

//如果左邊的柱子更短,那么向內(nèi)移動左邊的柱子,因為只有這樣,才有可能找到一個更高的水面
//在寬度一定變小的情況下,水的面積才有可能增大
if(height[left]//向內(nèi)移動左邊的柱子
left++;

//如果右邊的柱子更短,那么向內(nèi)移動右邊的柱子,因為只有這樣,才有可能找到一個更高的水面
//在寬度一定變小的情況下,水的面積才有可能增大
}else{
//向內(nèi)移動右邊的柱子
right--;
}

}

//最后返回最大的面積res即可
returnres;
}
};

3、Python 代碼

#登錄AlgoMooc官網(wǎng)獲取更多算法圖解
#https://www.algomooc.com/587.html
#作者:程序員吳師兄
#代碼有看不懂的地方一定要私聊咨詢吳師兄呀
#盛最多水的容器(LeetCode11):https://leetcode-cn.com/problems/container-with-most-water/
classSolution:
defmaxArea(self,height:List[int])->int:
#設(shè)置兩個索引,分別指向容器的兩側(cè)

#索引left指向最左邊的柱子
left=0

#索引right指向最右邊的柱子
right=len(height)-1

#設(shè)置一個變量用來保存當下水的最大面積
res=0

#移動left和right,直到left和right相遇為止
whileleft#水的寬度是right-left
width=right-left

#水的高度由兩根柱子最短的那根決定
h=min(height[left],height[right])

#計算此時水的面積
area=width*h

#如果此時水的面積大于了我們之前保存的那個值,我們需要更新一下
ifarea>=res:
#更新res的值為area,確保res一直都是最大的值
res=area

#接下來去觀察需要移動哪根柱子:必定是最短的那根柱子

#如果左邊的柱子更短,那么向內(nèi)移動左邊的柱子,因為只有這樣,才有可能找到一個更高的水面
#在寬度一定變小的情況下,水的面積才有可能增大
ifheight[left]#向內(nèi)移動左邊的柱子
left+=1

#如果右邊的柱子更短,那么向內(nèi)移動右邊的柱子,因為只有這樣,才有可能找到一個更高的水面
#在寬度一定變小的情況下,水的面積才有可能增大
else:
#向內(nèi)移動右邊的柱子
right-=1

#最后返回最大的面積res即可
returnres

四、復(fù)雜度分析

時間復(fù)雜度:O(N),雙指針總計最多遍歷整個數(shù)組一次。

空間復(fù)雜度:O(1),只需要額外的常數(shù)級別的空間。

審核編輯 :李倩


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

    關(guān)注

    19

    文章

    2975

    瀏覽量

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

    關(guān)注

    0

    文章

    499

    瀏覽量

    22125
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4828

    瀏覽量

    69063

原文標題:雙指針,從兩頭開始內(nèi)卷,先卷了挫的那頭

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

收藏 人收藏

    評論

    相關(guān)推薦

    昌工業(yè)高溫激光紅外測溫儀產(chǎn)品介紹

    在工業(yè)生產(chǎn)中,高溫環(huán)境下的溫度測量與控制至關(guān)重要。華昌DT-8878/8879 工業(yè)高溫激光紅外線測溫儀,能夠在惡劣的工業(yè)環(huán)境下,快速、準確地獲取目標物體的溫度信息,為工業(yè)生產(chǎn)過程的優(yōu)化、設(shè)備的安全運行以及產(chǎn)品質(zhì)量的保障提供有力支持。
    的頭像 發(fā)表于 12-09 16:37 ?420次閱讀

    超級電容器的為什么電層間隔小

    超級電容器因其高功率密度、長循環(huán)壽命和快速充放電能力而在許多領(lǐng)域受到重視。這些特性主要歸功于其獨特的電層結(jié)構(gòu)。 超級電容器的工作原理 電層的形成 : 當電極浸入電解質(zhì)中時,電極表面
    的頭像 發(fā)表于 09-27 10:29 ?451次閱讀

    面試常考+1:函數(shù)指針指針函數(shù)、數(shù)組指針指針數(shù)組

    在嵌入式開發(fā)領(lǐng)域,函數(shù)指針指針函數(shù)、數(shù)組指針指針數(shù)組是一些非常重要但又容易混淆的概念。理解它們的特性和應(yīng)用場景,對于提升嵌入式程序的效率和質(zhì)量至關(guān)重要。一、
    的頭像 發(fā)表于 08-10 08:11 ?990次閱讀
    面試常考+1:函數(shù)<b class='flag-5'>指針</b>與<b class='flag-5'>指針</b>函數(shù)、數(shù)組<b class='flag-5'>指針</b>與<b class='flag-5'>指針</b>數(shù)組

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

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

    電層法拉電容器相較于傳統(tǒng)化學(xué)電池有什么優(yōu)點?

    電層法拉電容(DoubleLayerCapacitor)也被稱為超級電容器(Supercapacitor)或超級電容(Ultracapacitor),是一種能量存儲設(shè)備,用于存儲和釋放大量電荷
    的頭像 發(fā)表于 06-28 11:35 ?490次閱讀
    <b class='flag-5'>雙</b>電層法拉電<b class='flag-5'>容器</b>相較于傳統(tǒng)化學(xué)電池有什么優(yōu)點?

    面試中的高頻問題:指針函數(shù)與函數(shù)指針,你能完美應(yīng)對嗎?

    一直覺得C語言較其他語言最偉大的地方就是C語言中的指針,有些人認為指針很簡單,而有些人認為指針很難,當然這里的對簡單和難并不是等價于對指針的理解程度。為此在這里對C語言中的
    的頭像 發(fā)表于 06-22 08:11 ?1842次閱讀
    面試中的高頻問題:<b class='flag-5'>指針</b>函數(shù)與函數(shù)<b class='flag-5'>指針</b>,你能完美應(yīng)對嗎?

    靜電計和驗電器的指針偏角和什么有關(guān)?

    靜電計和驗電器的指針偏角是由多種因素決定的,這些因素包括電容器的電容變化、電荷量、電勢差、分布電容、靜電計的顯示特性曲線等。
    的頭像 發(fā)表于 05-20 17:53 ?7807次閱讀

    指針式萬用表概述及工作原理 指針式萬用表的使用技巧及注意事項

    指針式萬用表,作為電子測量領(lǐng)域中的一種經(jīng)典工具,憑借其直觀、易讀、精度高等特點,一直受到廣大電子工程師和電工的青睞。本文旨在全面介紹指針式萬用表的技術(shù)特點、工作原理、測量功能、使用技巧以及常見故障與處理方法,以期為讀者提供一份詳
    的頭像 發(fā)表于 05-10 16:15 ?2752次閱讀

    探尋未來科技:超親聚合物超級電容器

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

    爆點十足!騰精密半導(dǎo)體技術(shù)矩陣亮相

    滬上展,爆點十足 3月20~22日,備受矚目的 慕尼黑電子展、SEMICON展 正在火熱開展中 Tensun騰與國內(nèi)外展商 專業(yè)人士及媒體齊聚一堂 共襄展現(xiàn)場圖▼ 騰
    的頭像 發(fā)表于 03-21 08:43 ?451次閱讀
    爆點十足!騰<b class='flag-5'>盛</b>精密半導(dǎo)體技術(shù)矩陣亮相<b class='flag-5'>雙</b>展

    電層電容器的工作原理 電層電容器的特點

    電層電容器的工作原理 電層電容器的特點? 電層電容器是一種特殊的電
    的頭像 發(fā)表于 03-07 17:14 ?4806次閱讀

    電層電容器的分類及優(yōu)點

    電層電容器的分類及優(yōu)點? 電層電容器是一種能夠存儲電荷的電子設(shè)備,它由兩個電極和介質(zhì)組成,能夠產(chǎn)生一個很大的表面積-電介質(zhì)界面,從而實現(xiàn)高電容量。
    的頭像 發(fā)表于 03-07 16:39 ?1203次閱讀

    電層電容器和贗電容器的區(qū)別

    電層電容器和贗電容器的區(qū)別? 電層電容器和贗電容器是目前廣泛應(yīng)用于能量存儲領(lǐng)域的兩類電
    的頭像 發(fā)表于 03-05 15:48 ?3285次閱讀

    C語言的指針用法

    C語言編程中善用指針可以簡化一些任務(wù)的處理,而對于一些任務(wù)(比如動態(tài)內(nèi)存分配),必須要有指針才行的。也就是說精通C指針編程是很有必要的,幫助你成為一名優(yōu)秀的Cer。
    發(fā)表于 03-05 14:22 ?391次閱讀
    C語言的<b class='flag-5'>指針</b>用法

    怎么理解指針指針

    怎么理解指針指針?其實這個概念并不難,只是把它放到實際應(yīng)用中,容易造成困擾。
    的頭像 發(fā)表于 02-23 16:46 ?1288次閱讀
    怎么理解<b class='flag-5'>指針</b>的<b class='flag-5'>指針</b>?
    皇冠国际| 百家乐官网游戏程序下载| 百家乐有送体验金| 赌博百家乐官网秘笈| 澳门百家乐玩大小| 百家乐官网硬币打法| 连环百家乐官网的玩法技巧和规则| 皇廷娱乐| 赌场百家乐怎么破解| 葡京百家乐官网的玩法技巧和规则| 汝州市| 百家乐吹| 将军百家乐官网的玩法技巧和规则| 罗甸县| 百家乐看图赢| 免费百家乐规则| 百家乐官网博彩策略论坛| 水果机的规律| 哪个百家乐投注比较好| 百家乐官网博彩安全吗| 网络龙虎| 大发888亚洲| 宝马百家乐的玩法技巧和规则| 百家乐大路小路| 百家乐官网大西洋城v| 百家乐官网哪家信誉好| 百家乐官网代打公司| 平远县| 城固县| 狮威娱乐城| 百家乐麻将牌| 百家乐微笑玩| 西游记百家乐娱乐城| 聚宝盆百家乐的玩法技巧和规则| 百家乐庄闲的比例| 伟易博百家乐官网现金网| 金木棉赌场| 飞七棋牌游戏下载| 葡京娱乐场官网| 888达人| 必胜娱乐|