1.题目:
给你 n 个非负整数 a1,a2,...,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0) 。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。
说明:你不能倾斜容器
示例 1:
输入:[1,8,6,2,5,4,8,3,7]
输出:49
解释:图中垂直线代表输入数组 [1,8,6,2,5,4,8,3,7]。在此情况下,容器能够容纳水(表示为蓝色部分)的最大值为 49。
2.思路:
我利用C语言实现。
首先分析这道题,求容纳最多水,那么就是求垂直线所对应的面积。在两条垂直线中间的面积势必以最低的那一条再乘以两垂直线的距离为标准。
接下来是如何找到最大面积。这里我分别从数组的两端进行遍历。比如首次:
int i = 0, j = heightSize - 1; //数组从两边开始
那么第一个面积可以表示成area = (8-0)*1 = 8。
已知是按低的垂直线为标准,那么我分别从左边垂直线低和右边垂直线低定义了两个容积常量left_area,right_area。还有总的area。
int area; //最大容积
int left_area;
int right_area;
然后利用while循环进行遍历,i从左边,j从右边,终止条件为i == j;
当左边的数小于右边的数时,计算左边的容积,然后与总的容积比较,把大的给area(这里利用三目运算符),小的垂直线移向下一位。
if (height[i] < height[j])
{
left_area = (j - i) * height[i];
area = (area > left_area) ? area : left_area; //刚开始的面积
i++; //短的继续向下一个移动
}
右边的与左边类似。
else
{
right_area = (j - i) * height[j];
area = (area > right_area) ? area : right_area;
j--;
}
最后经过比较,erea内存储的就是最大容积。
return area;
3. 完整代码:
int maxArea(int *height, int heightSize)
{
int i = 0, j = heightSize - 1; //数组从两边开始
int area; //最大容积
int left_area;
int right_area;
while(i != j)
{
if (height[i] < height[j])
{
left_area = (j - i) * height[i];
area = (area > left_area) ? area : left_area; //刚开始的面积
i++; //短的继续向下一个移动
}
else
{
right_area = (j - i) * height[j];
area = (area > right_area) ? area : right_area;
j--;
}
}
return area;
}