题目:
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.
思路:
思路1为两层遍历,思路2类似
http://blog.csdn.net/lanxu_yy/article/details/17335239的思路。利用一个数组保存可能的水池左侧,另一个数组保存可能的水池右侧。
代码:
思路1:
class Solution {
public:
int maxArea(vector<int> &height) {
int max=0;
for(int i=0;i<height.size();i++)
{
for(int j=i+1;j<height.size();j++)
{
int a = area(height,i,j);
if(a>max)
max=a;
}
}
return max;
}
int area(vector<int> &height, int i, int j)
{
int h = height[i]<height[j]?height[i]:height[j];
return h*(j-i);
}
};
思路2:
class Solution {
public:
vector<int> begin;
vector<int> ibegin;
vector<int> end;
vector<int> iend;
int maxArea(vector<int> &height) {
if(height.size()<=1)
return 0;
begin.push_back(height[0]);
ibegin.push_back(0);
end.push_back(height[1]);
iend.push_back(1);
for(int i=1;i<height.size();i++)
{
if(begin[begin.size()-1]<height[i])
{
begin.push_back(height[i]);
ibegin.push_back(i);
}
if(end[end.size()-1]<=height[i])
{
end[end.size()-1] = height[i];
iend[end.size()-1] = i;
}
else
{
end.push_back(height[i]);
iend.push_back(i);
}
}
int max = 0;
for(int i=0;i<begin.size();i++)
{
for(int j=0;j<end.size();j++)
{
if(ibegin[i]<iend[j])
{
int area = (begin[i]<end[j]?begin[i]:end[j])*(iend[j]-ibegin[i]);
if(area > max)
max = area;
}
}
}
return max;
}
};