摘要:題目要求給一個(gè)數(shù)組,其中數(shù)組在下標(biāo)處的值為,坐標(biāo)和坐標(biāo)構(gòu)成一條垂直于坐標(biāo)軸的直線?,F(xiàn)任取兩條垂線和軸組成四邊形容器。當(dāng)左右指針相遇時(shí),指針假設(shè)該算法并沒(méi)有遍歷到容量最大的情況我們令容量最大時(shí)的指針為和。
題目要求:給一個(gè)數(shù)組,其中數(shù)組在下標(biāo)i處的值為A[i],坐標(biāo)(i,A[i])和坐標(biāo)(i,0)構(gòu)成一條垂直于坐標(biāo)軸x的直線?,F(xiàn)任取兩條垂線和x軸組成四邊形容器。問(wèn)其中盛水量最大為多少?
思路一:暴力的雙重循環(huán)這種實(shí)現(xiàn)非常原始,在這里就不贅述了,時(shí)間復(fù)雜度為O(n2),在數(shù)據(jù)量較大的時(shí)候,性能很差
思路二:雙指針減少循環(huán)的核心思路是省去沒(méi)有必要的遍歷,并且確保所需的答案一定能被遍歷到
假設(shè)現(xiàn)在有一個(gè)容器,則容器的盛水量取決于容器的底和容器較短的那條高
則我們可以從最大的底長(zhǎng)入手,即當(dāng)容器的底等于數(shù)組的長(zhǎng)度時(shí),則容器的盛水量為較短邊的長(zhǎng)乘底
可見(jiàn) 只有較短邊會(huì)對(duì)盛水量造成影響,因此移動(dòng)較短邊的指針,并比較當(dāng)前盛水量和當(dāng)前最大盛水量。直至左右指針相遇。
主要的困惑在于如何移動(dòng)雙指針才能保證最大的盛水量被遍歷到
假設(shè)有左指針left和右指針right,且left指向的值小于right的值,假如我們將右指針左移,則右指針左移后的值和左指針指向的值相比有三種情況
右指針指向的值大于左指針
這種情況下,容器的高取決于左指針,但是底變短了,所以容器盛水量一定變小
右指針指向的值等于左指針
這種情況下,容器的高取決于左指針,但是底變短了,所以容器盛水量一定變小
右指針指向的值小于左指針
這種情況下,容器的高取決于右指針,但是右指針小于左指針,且底也變短了,所以容量盛水量一定變小了
綜上所述,容器高度較大的一側(cè)的移動(dòng)只會(huì)造成容器盛水量減小
所以應(yīng)當(dāng)移動(dòng)高度較小一側(cè)的指針,并繼續(xù)遍歷,直至兩指針相遇。
public int maxArea(int[] height) { int left = 0; int right = height.length-1; int max = 0; while(left更新:更嚴(yán)謹(jǐn)?shù)淖C明 之前證明的只是在左指針不改變的情況下,左移右指針只會(huì)造成容器的容量減小。但是一旦緊接著左指針發(fā)生變化,就無(wú)法證明以該左指針為一側(cè)高,右指針右側(cè)的值生成的容器的容量比當(dāng)前值小。
以下補(bǔ)充一個(gè)簡(jiǎn)單的反證法證明算法的合理性
當(dāng)前的算法為:使用兩個(gè)指針?lè)謩e指向數(shù)組的頭和尾。指向的值較小的那個(gè)指針移動(dòng),即左指針右移,右指針左移。當(dāng)左右指針相遇時(shí),指針
假設(shè):該算法并沒(méi)有遍歷到容量最大的情況
我們令容量最大時(shí)的指針為p_left和p_right。根據(jù)題設(shè),我們可以假設(shè)遍歷時(shí)左指針先到達(dá)p_left,但是當(dāng)左指針為p_left時(shí),右指針還沒(méi)有經(jīng)過(guò)p_right左指針就移動(dòng)了
已知當(dāng)左指針停留在p_left時(shí),它只有在兩種場(chǎng)景下會(huì)發(fā)生改變左指針和右指針在p_left相遇,則右指針一定在前往p_left的途中經(jīng)過(guò)p_right,與題設(shè)矛盾
右指針位于p_right右側(cè)且當(dāng)前的值大于左指針。則在這種情況下,此時(shí)容器的盛水量比題設(shè)中最大的盛水量還要大,與題設(shè)矛盾
因此該算法的遍歷一定經(jīng)過(guò)了最大的盛水量的情況
想要了解更多開(kāi)發(fā)技術(shù),面試教程以及互聯(lián)網(wǎng)公司內(nèi)推,歡迎關(guān)注我的微信公眾號(hào)!將會(huì)不定期的發(fā)放福利哦~
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/66889.html
摘要:最新更新請(qǐng)?jiān)L問(wèn)棧法復(fù)雜度時(shí)間空間思路最大盛水量取決于兩邊中較短的那條邊,而且如果將較短的邊換為更短邊的話,盛水量只會(huì)變少。所以我們可以用兩個(gè)頭尾指針,計(jì)算出當(dāng)前最大的盛水量后,將較短的邊向中間移,因?yàn)槲覀兿肟纯茨懿荒馨演^短的邊換長(zhǎng)一點(diǎn)。 Container With Most Water 最新更新請(qǐng)?jiān)L問(wèn):https://yanjia.me/zh/2018/11/... Given n...
摘要:一題目盛最多水的容器給定個(gè)非負(fù)整數(shù),,,,每個(gè)數(shù)代表坐標(biāo)中的一個(gè)點(diǎn)。在坐標(biāo)內(nèi)畫(huà)條垂直線,垂直線的兩個(gè)端點(diǎn)分別為和。找出其中的兩條線,使得它們與軸共同構(gòu)成的容器可以容納最多的水。在此情況下,容器能夠容納水表示為藍(lán)色部分的最大值為。 一、題目 盛最多水的容器: 給定 n 個(gè)非負(fù)整數(shù) a1,a2,...,an,每個(gè)數(shù)代表坐標(biāo)中的一個(gè)點(diǎn)?(i,?ai) 。在坐標(biāo)內(nèi)畫(huà) n 條垂直線,垂直線 i?...
摘要:一題目描述空格分隔,逐個(gè)反轉(zhuǎn)二題目描述三題目描述當(dāng)然也可以用的做,不過(guò)用雙指針更快。 LeetCode: 557. Reverse Words in a String III 一、LeetCode: 557. Reverse Words in a String III 題目描述 Given a string, you need to reverse the order of chara...
摘要:我們需要找出這些線所圍成的容器,能裝最多水的水量。這道題是不能用蠻力法解決的,會(huì)超時(shí)。這個(gè)解法想法是這樣的,我們用兩個(gè)變量,指向數(shù)組的起始元素和末尾元素。首先計(jì)算這兩條線所圍成的容器面積,然后移動(dòng)指向較短的線段的指針。 題目詳情 Given n non-negative integers a1, a2, ..., an, where each represents a point at...
摘要:我先通過(guò)堆棧的方法,找到一個(gè)封閉區(qū)間,該區(qū)間可以盛水,該區(qū)間的右節(jié)點(diǎn)可以作為下一個(gè)封閉區(qū)間的起點(diǎn)。思路三堆棧的聰明使用在這里,堆棧允許我們漸進(jìn)的通過(guò)橫向分割而非之前傳統(tǒng)的縱向分割的方式來(lái)累加計(jì)算盛水量。 題目要求 Given n non-negative integers representing an elevation map where the width of each bar...
閱讀 2135·2019-08-29 16:53
閱讀 2712·2019-08-29 16:07
閱讀 2054·2019-08-29 13:13
閱讀 3277·2019-08-26 13:57
閱讀 1342·2019-08-26 13:31
閱讀 2446·2019-08-26 13:22
閱讀 1232·2019-08-26 11:43
閱讀 2095·2019-08-23 17:14