题目描述:
给你 n 个非负整数 a1,a2,…,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0) 。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水
解题思路:
这里用双指针法。
算法思路:
用两个指针l,r指向数组的头和尾:
int l = 0,r = height.size()-1;
定义一个变量用来保存最后的结果,初始化为0:
int ans = 0;
接下来就是寻找最大容量的过程了,类似最短木板,即最大容量取决于最短的那块木板,这里的容量实际为矩形的面积,等于左右指针的距离乘以左右指针中较小者的值,因此可以写出如下代码
int area = min(height[l],height[r])*(r-l);
//这里用area来保存在寻找过程中每一步的容量值
寻找过程
在寻找过程中,由于是寻找最大容量,因此如果左指针的值小于右指针的值,左指针就要往右移 一位,右指针小的话右指针就要左移。直到左指针和右指针相遇
while(l<r)//寻找的条件为左指针小于右指针
{
int area = min(height[l],height[r])*(r-l);//用area来保存每次的容量。
ans=max(ans,area);//ans保存最大容量
if(height[l]<=height[r])
{
++l;//如果左指针小,左指针右移一位,以寻求较大值
}
else
{
--r;如果右指针小,右指针左移一位,以寻求较大值
}
}
最后返回ans
return ans;
整体代码如下:
class Solution {
public:
int maxArea(vector<int>& height) {
int l = 0,r = height.size()-1;
int ans = 0;
while(l<r)
{
int area = min(height[l],height[r])*(r-l);
ans=max(ans,area);
if(height[l]<=height[r])
{
++l;
}
else
{
--r;
}
}
return ans;
}
};
感想:
所谓解题思路解题思路是解过了才有思路,这题不算复杂,但看到了就是没有思路,还是练习少了。