1 题目
给你 n 个非负整数 a1,a2,...,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0) 。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。
2 解法
2.1 思路
这道题用双指针的解法可以让时间复杂度o(N).
至于为什么可以用双指针的方法,思路如下:
第一步, 让左指针在最左边, 右指针在最右边, 假设左边界的值为x, 右边界的值为y, 左右边界的距离为t, 那么此时能容纳的水为V = min(x, y) * t;
如果想要找到比V更大的左右边界, 我们需要看x和y的大小, 如果x<y, 那么左边界和任意一个另外一个右边界组合都不会比现在的V大, 所以它就不可能是今后的目标的.所以左边界舍弃, 也就是左边界往右移一, 把现在左右边界看作一个新的容器, 重复第一步(右边界同理). 所以这就转化为了双指针问题.
2.2 代码
int maxArea(vector<int>& height) {int maxCapacity = 0;int left = 0;int right = height.size() - 1;while (left < right) {int tCapacity = (right - left) * min(height[left], height[right]);if (tCapacity > maxCapacity) {maxCapacity = tCapacity;}if (height[left] < height[right]) {left ++;} else {right --;}}return maxCapacity;}