LeetCode笔记——11. 盛最多水的容器

11. 盛最多水的容器

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

question_11.jpg

题解:双指针方法

class Solution {
    //双指针方法
    public int maxArea(int[] height) {
        //定义左右双指针,分别为数组的起始点
        int maxarea = 0, l = 0, r = height.length - 1;
        //当左指针小于右指针时
        while (l < r) {
            //计算容积最大值
            maxarea = Math.max(maxarea,
                              //计算容积(最短的线*左右指针的间距)     
                              Math.min(height[l], height[r]) * (r - l));
            //谁最短谁向内移动
            if (height[l] < height[r])
                l++;
            else
                r--;
        }
        return maxarea;
    }
}

复杂度分析
时间复杂度:O(n),一次扫描。
空间复杂度:O(1),使用恒定的空间。

双指针方法的典型用法

你可能感兴趣的:(LeetCode笔记——11. 盛最多水的容器)