题目
Number: 11
Difficulty: Medium
Tags: Array, Two Pointers
Given n non-negative integers
a1, a2, ..., an
, where each represents a point at coordinate(i, ai)
. n vertical lines are drawn such that the two endpoints of line i is at(i, ai)
and(i, 0)
. Find two lines, which together with x-axis forms a container, such that the container contains the most water.Note: You may not slant the container.
题解
蓄水池问题的初级形式,两个指针分别从头尾向中间遍历,当左边小于右边时,移动左边寻找比左边更大的,计算面积,当右边小于左边时,移动右边寻找比右边更大的,计算面积。如果新面积更大,更新。
代码
int maxArea(vector<int>& height) {
int area, i = 0, j = height.size() - 1;
int lh = height[i], rh = height[j];
area = min(lh, rh) * (j - i);
while(i < j)
{
if(lh < rh)
{
while(height[++i] < lh && i < j);
if(i < j)
lh = height[i];
}
else
{
while(height[--j] < rh && i < j);
if(i < j)
rh = height[j];
}
area = max(area, min(lh, rh) * (j - i));
}
return area;
}