国产精品久久久aaaa,日日干夜夜操天天插,亚洲乱熟女香蕉一区二区三区少妇,99精品国产高清一区二区三区,国产成人精品一区二区色戒,久久久国产精品成人免费,亚洲精品毛片久久久久,99久久婷婷国产综合精品电影,国产一区二区三区任你鲁

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

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

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

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

算法與數(shù)據(jù)結(jié)構(gòu) ? 來源:吳師兄學(xué)算法 ? 作者:吳師兄學(xué)算法 ? 2022-07-28 11:25 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

大家好,我是吳師兄,

今天的題目來源于 LeetCode 第 11 號(hào)問題:盛最多水的容器,難度為「中等」,屬于雙指針的經(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)ヒ苿?dòng)哪根柱子會(huì)更加合適?

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

移動(dòng)右邊那根更高的柱子?

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

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

移動(dòng)左邊那根更短的柱子?

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

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

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

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

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

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

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

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

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

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;

//移動(dòng)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;
}

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

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

//如果右邊的柱子更短,那么向內(nèi)移動(dòng)右邊的柱子,因?yàn)橹挥羞@樣,才有可能找到一個(gè)更高的水面
//在寬度一定變小的情況下,水的面積才有可能增大
}else{
//向內(nèi)移動(dòng)右邊的柱子
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;

//移動(dòng)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;
}

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

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

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

#移動(dòng)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

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

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

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

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

四、復(fù)雜度分析

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

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

審核編輯 :李倩


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

    關(guān)注

    20

    文章

    3001

    瀏覽量

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

    關(guān)注

    0

    文章

    531

    瀏覽量

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

    關(guān)注

    30

    文章

    4968

    瀏覽量

    73970

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

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

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

掃碼添加小助手

加入工程師交流群

    評(píng)論

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

    可水洗、不發(fā)霉的壓電霧化導(dǎo)結(jié)構(gòu)(解決棉芯通病)

    作用:只做界面銜接,不做主體儲(chǔ)水,保證導(dǎo)連續(xù) 核心優(yōu)勢(shì) 從結(jié)構(gòu)上解決發(fā)霉、異味問題 可拆洗、可芯輪換使用 成本低、易量產(chǎn)、適配現(xiàn)有壓電霧化方案 原創(chuàng)公開存證: 文件名稱:衛(wèi)生型壓電霧化導(dǎo)結(jié)構(gòu)
    發(fā)表于 02-28 16:58

    指針與函數(shù)詳解

    1、指針函數(shù)指針函數(shù),從名字上看它本質(zhì)上是一個(gè)函數(shù)。指針函數(shù):返回值類型是指針的函數(shù)。函數(shù)聲明如下: int *plusfunction(int a,int b); 當(dāng)然也可以
    發(fā)表于 01-23 06:02

    函數(shù)指針介紹

    就是一個(gè)指針函數(shù)。其返回值是一個(gè) int 類型的指針,是一個(gè)地址。 指針函數(shù)也沒什么特別的,和普通函數(shù)對(duì)比不過就是其返回了一個(gè)指針(即地址值)而已。
    發(fā)表于 01-21 08:11

    指針難學(xué)的4點(diǎn)原因分析

    難點(diǎn)1. 討厭的星號(hào) 定義指針變量p時(shí),都會(huì)加個(gè)*號(hào)。在用到指針變量p時(shí),也會(huì)加個(gè)*號(hào)。比如以下代碼: int main() { int *p; p = malloc(sizeof(int
    發(fā)表于 01-16 06:12

    指針的基礎(chǔ)

    1. int va; 這是一個(gè)整型變量,32位CPU的話,占有32個(gè)bite 2. int *va; 這是一個(gè)整型指針變量,用于存放一個(gè)整型變量的地址 3. int **va; 這是一個(gè)整型
    發(fā)表于 12-15 06:06

    函數(shù)指針指針函數(shù)的區(qū)別

    在學(xué)習(xí)arm過程中發(fā)現(xiàn)這“指針函數(shù)”與“函數(shù)指針”容易搞錯(cuò),所以今天,我自己想一次把它搞清楚,找了一些資料,和大家的一些總結(jié),整理到此。和大家分享。   首先它們之間的定義:   1、指針函數(shù)是指帶
    發(fā)表于 12-12 06:34

    函數(shù)指針的概念

    函數(shù)指針是指向函數(shù)的指針變量。 通常我們說的指針變量是指向一個(gè)整型、字符型或數(shù)組等變量,而函數(shù)指針是指向函數(shù)。 函數(shù)指針可以像一般函數(shù)一樣
    發(fā)表于 12-11 08:10

    如何用函數(shù)指針調(diào)用函數(shù)

    給大家舉一個(gè)例子: int Func(int x);/*聲明一個(gè)函數(shù)*/ int (*p) (int x);/*定義一個(gè)函數(shù)指針*/ p = Func; /*將Func函數(shù)的首地址賦給指針變量
    發(fā)表于 12-11 06:26

    C指針的妙用分享

    1、你知道嗎?指針其實(shí)是個(gè)天生的數(shù)學(xué)家!看這個(gè): #include int main() { int arr[] = {10, 20, 30, 40, 50}; int *p = arr
    發(fā)表于 11-17 06:35

    電層超級(jí)電容器原理

    電層超級(jí)電容器通過物理吸附實(shí)現(xiàn)儲(chǔ)能,壽命長(zhǎng),結(jié)構(gòu)為三明治,分為電層和贗電容兩類。
    的頭像 發(fā)表于 11-14 09:22 ?697次閱讀
    <b class='flag-5'>雙</b>電層超級(jí)電<b class='flag-5'>容器</b>原理

    電層超級(jí)電容器工作原理詳解

    電層超級(jí)電容器通過納米界面效應(yīng)實(shí)現(xiàn)高能量密度和快速充放電,利用電層與贗電容協(xié)同提升性能。
    的頭像 發(fā)表于 09-19 09:22 ?1687次閱讀
    <b class='flag-5'>雙</b>電層超級(jí)電<b class='flag-5'>容器</b>工作原理詳解

    季豐電子與劍科技達(dá)成戰(zhàn)略合作

    8月29日,在劍科技成立20周年慶祝活動(dòng)上,季豐電子與劍科技舉行了正式的戰(zhàn)略合作簽約儀式。
    的頭像 發(fā)表于 09-01 18:08 ?1197次閱讀

    電層超級(jí)電容器電極材料有哪些?全面解析高性能儲(chǔ)能解決方案

    文章總結(jié):電層超級(jí)電容器電極材料涵蓋碳基、金屬氧化物、導(dǎo)電聚合物,各具優(yōu)勢(shì),推動(dòng)儲(chǔ)能技術(shù)發(fā)展。
    的頭像 發(fā)表于 08-18 09:39 ?1572次閱讀
    <b class='flag-5'>雙</b>電層超級(jí)電<b class='flag-5'>容器</b>電極材料有哪些?全面解析高性能儲(chǔ)能解決方案

    2025電賽題目問答(已更新)

    2025電賽題目問答(已更新)
    的頭像 發(fā)表于 07-30 12:59 ?5153次閱讀
    2025電賽<b class='flag-5'>題目</b>問答(已更新)

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

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