OJ练习46——T11 Container With Most Water

一串非负整数,和其序号构成数对(i,v[i]),每条垂直线段的两个端点由(i,0),(i,v[i])两个点构成,两条线段与x轴形成一个容器,求最大容器的储水量。

(容器不能倾斜)

【思路】

1.O(n^2)法:即一个对角线为0的上三角矩阵,求每条线段与其后面的所有线段组成容器的容量(其实就是面积)。该法leecode判超时。

2.两边向中间压缩搜索,快排思想。从两边较短的线段开始向中靠拢。时间O(logn)。

基于事实:对于一个最大容器,其右边一定没有比该容器右线段更长的线段,同理,其左边一定没有比容器左线段更长的线段。

面积由底边和左右两边较短边的乘积得出,所以如果底边缩小,要想面积变大只有两边变长。

这种思路一定要学会用。

【other code】

int maxArea(vector<int>& h) {
        int res=0;  
        int n = h.size();  
        int l=0,r=n-1;  
        while(l<r)  
        {  
            res=max(res,min(h[l],h[r])*(r-l));  
            if (h[l]<h[r])  
            {  
                int k=l;  
                while(k<r&&h[k]<=h[l])  
                    k++;  
                l=k;  
                }  
            else  
            {  
                int k=r;  
                while(k>l&&h[k]<=h[r])  
                    k--;  
                r=k;  
             }  
        }  
        return res; 
    }

【总结】

代码简洁,特别是while(k<r&&h[k]<=h[l])  k++; 这句,学会用反面。

耗时29ms,排名靠前。
                  

posted on 2015-05-11 10:01  EmmaLi  阅读(111)  评论(0编辑  收藏  举报

导航