思路:
首先要理解清楚,两条直线构成一个容器,不考虑容器中的直线。首先取两端的直线,这样底边是所有方案中最长的,如果想找体积更大的方案,那么只能找更高的容器,因为其他方案底边只能更短。一个容器的高度是由较低的直线决定的,所以要想获得比当前状态更优的方案,那么只能更新较短的直线,才有可能获得更优的方案(这个地方,可以跳过比最短边还短的直线,但是没必要)。
这个思路有点贪心策略的意思,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的是在某种意义上的局部最优解。贪心算法不是对所有问题都能得到整体最优解,关键是贪心策略的选择,选择的贪心策略必须具备无后效性,即某个状态以前的过程不会影响以后的状态,只与当前状态有关。
题目:
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 and n is at least 2.
class Solution {
public:
int maxArea(vector<int>& height) {
int len=height.size();
int container;
int max=0;
int lo=0;
int hi=len-1;
while(lo<hi)
{
if(height[lo]<height[hi])
{
container=(hi-lo)*height[lo];
lo++;
}
else
{
container=(hi-lo)*height[hi];
hi--;
}
if(container>max)
{
max=container;
}
}
return max;
}
};