数据结构与算法之装最多水的容器

给定 n 个非负整数 a1, a2, ..., an, 每个数代表了坐标中的一个点 (i, ai)。画 n 条垂直线,使得 i 垂直线的两个端点分别为(i, ai)和(i, 0)。找到两条线,使得其与 x 轴共同构成一个容器,以容纳最多水。

样例
样例 1:

输入: [1, 3, 2]
输出: 2
解释:
选择 a1, a2, 容量为 1 * 1 = 1
选择 a1, a3, 容量为 1 * 2 = 2
选择 a2, a3, 容量为 2 * 1 = 2
样例 2:

输入: [1, 3, 2, 2]
输出: 4
解释:
选择 a1, a2, 容量为 1 * 1 = 1
选择 a1, a3, 容量为 1 * 2 = 2
选择 a1, a4, 容量为 1 * 3 = 3
选择 a2, a3, 容量为 2 * 1 = 2
选择 a2, a4, 容量为 2 * 2 = 4
选择 a3, a4, 容量为 2 * 1 = 2

    /**
     * @param heights: a vector of integers
     * @return: an integer
     * 双指针法:
     * 解题思路:
     *  最左最右两个指针,
     *  当左指针的长度 大于 右侧 指针 柱子长度 ,那么右侧指针向左移动
     *  反之 同理。
     *  把每次移动 (最左最右两个指针距离的长度 * 两个指针较小高度)
     *   跟上次的移动进行对比。
     *  时间复杂度 = N
     *  
     * 
     *  
     */
    public int maxArea(int[] heights) {
       int maxWater  = 0;
       int i = 0;
       int j = heights.length -1 ;
       while(i < j){//说明
             int tempWater = 0;
               if (heights[i] < heights[j]) {
                     tempWater = (j-i)*heights[i]; 
                     i++;
                     
               }else{
                     tempWater = (j-i)*heights[j];
                     j--;
               }
               if(maxWater < tempWater){
                  maxWater = tempWater ;
               }
       }
     return maxWater;

    }


你可能感兴趣的:(数据结构与算法之装最多水的容器)