30-Container With Most Water-Leetcode

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.

思路:要找到两根线使得容量最大

maxArea=min(height(begin),height(end))(endbegin)

贪心策略

思考:为什么贪心策略可以获得最优解?
我们所作的步奏是小的一端向中间紧缩,主要考虑这种策略是否会损失最有解,如下图

这里写图片描述
此时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;
    }
};
原文地址:https://www.cnblogs.com/freeopen/p/5482952.html