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