LeetCode 11. 盛最多水的容器(Container With Most Water)


 

題目描述

 

給定 n 個非負整數 a1a2,...,an,每個數代表坐標中的一個點 (iai) 。畫 n 條垂直線,使得垂直線 i 的兩個端點分別為 (iai) 和 (i, 0)。找出其中的兩條線,使得它們與 x 軸共同構成的容器可以容納最多的水。

注意:你不能傾斜容器,n 至少是2。

 

解題思路

 

考慮用雙指針法解題。維護兩個指針f、l分別指向數組左右兩端,則f和l構成的容器盛水體積計算公式為min(height[f],height[l])*(l-f)。可以看出盛水體積取決於容器邊中較小的數字和容器底長度。若移動較大的數字,則容器底長度會變小,而盛水的最大高度不變,所以盛水體積不會變更大。因此需要移動兩數中較小的數字,這樣若中間出現特別大的數字,則有可能提高盛水體積。然后每次移動完更新此時的最大盛水體積,直到兩指針相遇。

 

代碼

 

 1 class Solution {
 2 public:
 3     int maxArea(vector<int>& height) {
 4         int f=0,l=height.size()-1;
 5         int maxA=-1;
 6         while(f<l){
 7             int area=min(height[f],height[l])*(l-f);
 8             if(area>maxA)
 9                 maxA=area;
10             if(height[f]<height[l])
11                 f++;
12             else l--;
13         }
14         return maxA;
15     }
16 };

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM