91在线观看视频-91在线观看视频-91在线观看免费视频-91在线观看免费-欧美第二页-欧美第1页

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

完善資料讓更多小伙伴認(rèn)識你,還能領(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 個(gè)非負(fù)整數(shù) a1,a2,...,an,每個(gè)數(shù)代表坐標(biāo)中的一個(gè)點(diǎn) (i, ai) 。在坐標(biāo)內(nèi)畫 n 條垂直線,垂直線 i 的兩個(gè)端點(diǎn)分別為 (i, ai) 和 (i, 0) 。

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

二、題目解析

一開始,我們先去考慮相距最遠(yuǎn)的兩個(gè)柱子所能容納水的面積。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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è)置兩個(gè)索引,分別指向容器的兩側(cè)

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

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

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

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

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

//計(jì)算此時(shí)水的面積
intarea=width*h;

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

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

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

//如果右邊的柱子更短,那么向內(nèi)移動右邊的柱子,因?yàn)橹挥羞@樣,才有可能找到一個(gè)更高的水面
//在寬度一定變小的情況下,水的面積才有可能增大
}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è)置兩個(gè)索引,分別指向容器的兩側(cè)

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

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

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

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

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

//計(jì)算此時(shí)水的面積
intarea=width*h;

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

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

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

//如果右邊的柱子更短,那么向內(nèi)移動右邊的柱子,因?yàn)橹挥羞@樣,才有可能找到一個(gè)更高的水面
//在寬度一定變小的情況下,水的面積才有可能增大
}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è)置兩個(gè)索引,分別指向容器的兩側(cè)

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

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

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

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

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

#計(jì)算此時(shí)水的面積
area=width*h

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

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

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

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

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

四、復(fù)雜度分析

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

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

審核編輯 :李倩


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

    關(guān)注

    20

    文章

    2989

    瀏覽量

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

    關(guān)注

    0

    文章

    511

    瀏覽量

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

    關(guān)注

    30

    文章

    4900

    瀏覽量

    70790

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

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

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

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點(diǎn)推薦

    函數(shù)指針的六個(gè)常見應(yīng)用場景

    函數(shù)指針在嵌入式開發(fā)中有著廣泛的應(yīng)用,它讓代碼更加靈活,減少冗余,提高可擴(kuò)展性。很多時(shí)候,我們需要根據(jù)不同的情況動態(tài)調(diào)用不同的函數(shù),而函數(shù)指針正是實(shí)現(xiàn)這一需求的重要工具。本文將介紹六個(gè)常見的函數(shù)指針
    的頭像 發(fā)表于 04-07 11:58 ?548次閱讀
    函數(shù)<b class='flag-5'>指針</b>的六個(gè)常見應(yīng)用場景

    電子榮獲國家級綠色供應(yīng)鏈管理企業(yè)

    近日,國家工信部公布了2024年度綠色制造名單,航榮獲“國家級綠色供應(yīng)鏈管理企業(yè)”,這是公司繼獲評國家級綠色工廠后的又一國家級綠色資質(zhì)榮譽(yù),既是對航積極響應(yīng)“碳”政策的高度認(rèn)可,也是對航
    的頭像 發(fā)表于 02-19 17:31 ?618次閱讀

    指針式萬用表使用指南

    一、指針式萬用表簡介 指針式萬用表是一種傳統(tǒng)的電子測量工具,因其表頭指針的擺動來顯示測量結(jié)果而得名。與數(shù)字萬用表相比,指針式萬用表在某些情況下能提供更直觀的讀數(shù),尤其是在測量快速變化的
    的頭像 發(fā)表于 01-22 17:25 ?1774次閱讀

    指針式萬用表測量精度比較

    指針式萬用表的核心是一個(gè)可變電阻器(分壓器)和一個(gè)可動的指針。當(dāng)測量電壓或電流時(shí),通過分壓器的電阻值會改變,從而改變通過指針的電流,使指針在刻度盤上移動。
    的頭像 發(fā)表于 01-22 17:23 ?866次閱讀

    指針被釋放后就變成了空指針

    指針被釋放后,是不是就變成了空指針?有好多同學(xué)提出了這樣的問題。 借用《C專家編程》上面的一段代碼,可以很好的解釋這個(gè)問題。 ? ? #include int main(){ char *s
    的頭像 發(fā)表于 01-22 09:23 ?396次閱讀

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

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

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

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

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

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

    經(jīng)典圖神經(jīng)網(wǎng)絡(luò)(GNNs)的基準(zhǔn)分析研究

    本文簡要介紹了經(jīng)典圖神經(jīng)網(wǎng)絡(luò)(GNNs)的基準(zhǔn)分析研究,發(fā)表在 NeurIPS 2024。 文章回顧了經(jīng)典 GNNs 模型在節(jié)點(diǎn)分類任務(wù)上的表現(xiàn),結(jié)果發(fā)現(xiàn)過去 SOTA 圖學(xué)習(xí)模型報(bào)告的性能優(yōu)越
    的頭像 發(fā)表于 11-27 09:16 ?803次閱讀
    <b class='flag-5'>經(jīng)典</b>圖神經(jīng)網(wǎng)絡(luò)(GNNs)的基準(zhǔn)分析研究

    C語言程序設(shè)計(jì)教程第4版第8講:指針

    C語言指針講解
    發(fā)表于 11-20 14:10 ?6次下載

    C語言指針學(xué)習(xí)筆記

    本文從底層內(nèi)存分析,徹底讓讀者明白C語言指針的本質(zhì)。
    的頭像 發(fā)表于 11-05 17:40 ?654次閱讀
    C語言<b class='flag-5'>指針</b>學(xué)習(xí)筆記

    C語言指針運(yùn)算符詳解

    在C語言中,當(dāng)你有一個(gè)指向數(shù)組中某個(gè)元素的指針時(shí),你可以對該指針執(zhí)行某些算術(shù)運(yùn)算,例如加法或減法。這些運(yùn)算可以用來遍歷數(shù)組中的元素,如ptr[i]等價(jià)于*(ptr + i)。然而,如果你的操作使得指針指向了數(shù)組以外的位置(除了數(shù)
    的頭像 發(fā)表于 10-30 11:16 ?798次閱讀

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

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

    電流計(jì)指針偏轉(zhuǎn)方向是正極還是負(fù)極

    電流計(jì)指針的偏轉(zhuǎn)方向并非簡單地指向正極或負(fù)極,而是取決于電流的流入方向以及電流計(jì)正負(fù)極的連接方式。以下是對這一問題的分析: 一、電流流入方向與指針偏轉(zhuǎn)的關(guān)系 常規(guī)情況 : 對于常規(guī)的電流計(jì)(假設(shè)其
    的頭像 發(fā)表于 09-19 15:18 ?9880次閱讀

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

    在嵌入式開發(fā)領(lǐng)域,函數(shù)指針指針函數(shù)、數(shù)組指針指針數(shù)組是一些非常重要但又容易混淆的概念。理解它們的特性和應(yīng)用場景,對于提升嵌入式程序的效率和質(zhì)量至關(guān)重要。一、
    的頭像 發(fā)表于 08-10 08:11 ?1465次閱讀
    面試常考+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ù)組
    主站蜘蛛池模板: 香蕉久久精品 | 欧美成人三级伦在线观看 | 1024视频色版在线网站 | 黄色一级视频网 | 日本黄色电影在线 | 亚洲一区在线免费观看 | 久久久久久免费观看 | 色香视频一sxmv首页 | 上色天天综合网 | 中国农村一级片 | 天天色天天操天天射 | 色多多视频网站 | 色多多黄色| 天天操夜夜操视频 | 六月婷婷精品视频在线观看 | 日韩一级免费毛片 | 亚洲免费人成在线视频观看 | 成人爽爽激情在线观看 | 免费人成在线观看视频色 | 男人在线网站 | 欧美一区二区三区在线观看免费 | h网站在线观看 | 日韩啪啪电影 | 亚洲色图 欧美 | 年下攻高h好涨 | 性xxxx奶大欧美高清 | 一级毛片一级毛片 | 天天摸天天做天天爽 | 欧美色综合高清免费 | 亚洲色播永久网址大全 | 亚洲精品欧洲久久婷婷99 | 中文字幕在线第一页 | 亚洲成人777 | 天堂最新版免费观看 | 网红和老师啪啪对白清晰 | 天堂成人一区二区三区 | 四虎在线最新永久免费 | 欧美高清成人 | 国模人体一区二区三区 | 好爽毛片一区二区三区四 | 欧美日韩精品乱国产 |