11 盛最多水的容器
给定一个长度为 n 的整数数组 height。有 n 条垂线,第 i 条线的两个端点是  
     
      
       
       
         ( 
        
       
         i 
        
       
         , 
        
       
         0 
        
       
         ) 
        
       
      
        (i, 0) 
       
      
    (i,0)和  
     
      
       
       
         ( 
        
       
         i 
        
       
         , 
        
       
         h 
        
       
         e 
        
       
         i 
        
       
         g 
        
       
         h 
        
       
         t 
        
       
         [ 
        
       
         i 
        
       
         ] 
        
       
         ) 
        
       
      
        (i, height[i]) 
       
      
    (i,height[i]) 。
 找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。
 返回容器可以储存的最大水量。
 说明:你不能倾斜容器。
示例 1:
 
 输入:[1,8,6,2,5,4,8,3,7]
 输出:49
 解释:图中垂直线代表输入数组 [1,8,6,2,5,4,8,3,7]。在此情况下,容器能够容纳水(表示为蓝色部分)的最大值为 49。
示例 2:
 输入:height = [1,1]
 输出:1
提示:
 n == height.length
 2 <= n <=  
     
      
       
       
         1 
        
        
        
          0 
         
        
          5 
         
        
       
      
        10^5 
       
      
    105
 0 <= height[i] <=  
     
      
       
       
         1 
        
        
        
          0 
         
        
          4 
         
        
       
      
        10^4 
       
      
    104
思路
利用双指针的思想,分别指向首尾元素,分两种情况讨论:
 令 i 指向首元素,j 指向末元素
 当 
     
      
       
       
         h 
        
       
         e 
        
       
         i 
        
       
         g 
        
       
         h 
        
       
         t 
        
       
         [ 
        
       
         i 
        
       
         ] 
        
       
         < 
        
       
         = 
        
       
         h 
        
       
         e 
        
       
         i 
        
       
         g 
        
       
         h 
        
       
         t 
        
       
         [ 
        
       
         j 
        
       
         ] 
        
       
      
        height[i]<=height[j] 
       
      
    height[i]<=height[j]时,i 指针右移,因为高度需要取两者最小;
 当 
     
      
       
       
         h 
        
       
         e 
        
       
         i 
        
       
         g 
        
       
         h 
        
       
         t 
        
       
         [ 
        
       
         i 
        
       
         ] 
        
       
         > 
        
       
         h 
        
       
         e 
        
       
         i 
        
       
         g 
        
       
         h 
        
       
         t 
        
       
         [ 
        
       
         j 
        
       
         ] 
        
       
      
        height[i]>height[j] 
       
      
    height[i]>height[j]时,j 指针左移;
 每次计算面积得到最大面积即可。
代码
class Solution {
public:
    int maxArea(vector<int>& height) {
        int Smax = 0;
        int i = 0, j = height.size() - 1;
        while (i < j) {
            int len = j - i;
            if (height[i] <= height[j]) {
                Smax = max(Smax, len * height[i]);
                i++;
            } else {
                Smax = max(Smax, len * height[j]);
                j--;
            }
        }
        return Smax;
    }
};
                


















