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.
思路:要找到两根线使得容量最大
贪心策略
思考:为什么贪心策略可以获得最优解?
我们所作的步奏是小的一端向中间紧缩,主要考虑这种策略是否会损失最有解,如下图
此时end较小,end=end-1,这个步奏是否会遗漏最优解呢,如果是的话
,此时最优解以end结尾,但以end结尾的最大面积,也就是(begin,end)
这个面积我们已经计算过了,所以end = end -1,也就是说较小的一段向中间收缩的时候不会损失最优解,同理两端进行贪心操作是可以找到最优解的。
class Solution {
public:
int maxArea(vector<int>& height) {
int n = height.size();
int beg=0,end = n-1;
int max_area = 0;
while(beg<end)
{
int tmp=min(height[end],height[beg])*(end-beg);
if(max_area<tmp)max_area = tmp;
if(height[beg]<height[end]) beg++;
else end--;
}
return max_area;
}
};