问题描述
给你 n 个非负整数 a1,a2,…,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0)。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。
说明:你不能倾斜容器,且 n 的值至少为 2。
![](https://i-blog.csdnimg.cn/blog_migrate/c0292c12cd9a55f667f2706914fa84a0.png)
解题报告
这是第一次看到题目,想到双指针,想到指针移动方式,AC,全程不足10分钟,看来这段时间的刷题还是有点效果的。。。。
双指针法。
想到双指针后,此题的关键就在于双指针的移动方式。
我们不妨分析一下:设左右指针为 l
、r
,若 height[l]<height[r]
,则 height[i]
此后不会和任何右指针能组成最终答案的。
以 height[r-1]
举例子来说:
当height[r-1]>height[r]
时,那么 height[r-1]
和 height[l]
的最小高度不会比 height[l]
大,但是两者的距离减了 1
,所以最终的储水量必定较小。
当 height[r-1]<height[r]
时,同样的分析方法。
所以我们只需要移动height值较小的那个指针,而当两个指针的值相等时,随便移动哪个指针都可。
实现代码
class Solution {
public:
int maxArea(vector<int>& height) {
int ans=0, l=0, r=height.size()-1;
while(l<r){
ans=max(ans, min(height[l],height[r])*(r-l));
if(height[l]<height[r]) l++;
else r--;
}
return ans;
}
};