一、问题描述
给定n个正数a1,a2,...,an,其中每个元素代表一个坐标中的点(i,ai)。在(i,ai)与(i,0)间画出n条垂线 ,第i条线就是(i,ai)、(i,0)之间的连线,第i条垂线就是点(i,ai)到上述第i条连线的垂线。找出两条线,和x轴围成的面积组成一个容器,使得这个容器能盛最多的水。
二、思路
1.设置两个指针i,j,一头一尾,相向而行。假设i指向的挡板较低,j指向的挡板较高(height[i] < height[j])。
下一步移动哪个指针?
-- 若移动j,无论height[j-1]是何种高度,形成的面积都小于之前的面积。
-- 若移动i,若height[i+1] <= height[i],面积一定缩小:但若height[i+1] > height[i], 面积则有可能增大。
综上,应该移动指向较低挡板的那个指针。
三、Code
int MAX(int a, int b){return a > b ? a : b}
int MIN(int a, int b){return a < b ? a : b}
class Solution
{
public:
vector<int> maxArea(vector<int>& nums)
{
int len = nums.size(), low = 0, high = len -1;
int maxArea = 0;
while (low < high)
{
maxArea = MAX(maxArea, (high - low) * MIN(height[low], height[high]));
if (height[low] < height[high])
{
low++;
}
else
{
high--;
}
}
return maxArea;
}
};