题目描述:
给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。返回容器可以储存的最大水量。
学习:
拿到题,在想是不是动态规划,选这个的情况和不选这个回退到上一步的,但是回退后只知道盛水最大,但不知道是哪个边界,所以应该是有问题的。想想简单的或许双循环?哎,只会这种最笨的,试试吧,试了超时了,偷偷看了眼评论应该用双指针来做。
若两个指针指向同一数组,遍历方向相同且不会相交,也成为滑动窗口。我们需要从左往右单向遍历寻找的情况下就需要。例如之前做的找最大不重复字串长这种。
若指向同一数组,但是遍历方向相反,则可用来进行搜索,例如在本题中,如果我们都从左向右,那么其实收缩条件是很难的,最终感觉还是会变成历遍,采用反向移!参考的大大
所以快去试试!
class Solution {
public:
int maxArea(vector<int>& height) {
int n=height.size();
int result=(n-1)*min(height[0],height[n-1]);
int l=0,r=n-1;
while(l!=r)
{
if(height[l]>height[r]) {r--;} else {l++;}
int temp=(r-l)*min(height[l],height[r]);
if(temp>result)
{
result=temp;
}
}
return result;
}
};