給定一個(gè)長度為n的整數(shù)數(shù)組height。有n條垂線,第i條線的兩個(gè)端點(diǎn)是(i, 0)和(i, height[i])。
找出其中的兩條線,使得它們與x軸共同構(gòu)成的容器可以容納最多的水攒砖。
返回容器可以儲(chǔ)存的最大水量。
說明:你不能傾斜容器。
示例 1:
輸入:[1,8,6,2,5,4,8,3,7]輸出:49解釋:圖中垂直線代表輸入數(shù)組 [1,8,6,2,5,4,8,3,7]究驴。在此情況下,容器能夠容納水(表示為藍(lán)色部分)的最大值為?49匀伏。
示例 2:
輸入:height = [1,1]輸出:1
提示:
n == height.length
2 <= n <= 105
0 <= height[i] <= 104
解題思路:
(1)決定水槽容量的有寬度和最低的一側(cè)
(2)當(dāng)移動(dòng)較長板時(shí)洒忧,較短板不變或者變小。移動(dòng)較短板時(shí)帘撰,較短板可能變大變小或者不變跑慕。于是發(fā)現(xiàn)移動(dòng)較短板的時(shí)候,有可能提高水槽的容量摧找。
(3)下面需要考慮寬度的因素核行,如果可以讓寬度每次變化一定,那么就可以用(2)來判斷水槽容量的變化情況蹬耘。
(4)于是采用雙指針分別指向height的最右邊和最左邊芝雪,這樣不管移動(dòng)長板還是短板,寬度一定減小综苔,結(jié)合(2)惩系,移動(dòng)長板一定會(huì)導(dǎo)致水槽容量變小位岔。
算法:
(1)雙指針指向height左邊和右邊
(2)計(jì)算當(dāng)前水槽容量,更新最大值
(3)移動(dòng)短板指針堡牡,如果左右指針未相遇回到第(2)步抒抬,否則結(jié)束。
源代碼:
????int?maxArea(vector<int>&?height)?{
????????int?l=0,r=height.size()-1;
????????int?max=0;
????????while?(l!=r){
????????????int?temp=(r-l)*min(height[l],height[r]);
????????????if?(temp?>?max)?max=temp;
????????????height[l]<height[r]???++l?:?--r;
????????}
????????return?max;
????}