leetcode笔记--水箱问题

类型的引用:Solution *s=new Solution();

1.Container With Most Water

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.

给定一个vector作为纵线的高度输入,选择两条纵线使得他们和X轴一起构成的容器能够盛更多水。

参考:http://blog.csdn.net/patkritlee/article/details/52453417

解析:假设最大容器两条纵线为i,j,那么:a.在j的右端没有一条线会比它高!

b.在i的左端也不会有比它高的线!

c.所以我们从两头向中间靠拢,同时更新候选值;在收拢区间的时候优先从x,y中较小的边开始收缩;

代码:

class Solution {
public:
    int maxArea(vector<int>& height) {
        int l=0;
    int r=height.size()-1;
    int area=0;
    while(l<r){
        area=max(area,(r-l)*min(height[r],height[l]));

//查找l,r之间较小的h,从较小的一端开始逼近,找中间比它高的数值。
        if(height[l]<height[r]){
            int k=l;
            while(height[k]<=height[l])
                k++;
            l=k;
        }
        else{
            int k=r;
            while(height[k]<=height[r])
                k--;
            r=k;
        }
    }
 
    return area;
    }
};

原文地址:https://www.cnblogs.com/bananaa/p/7146226.html