牛客网每日一练

#
# 
# @param height int整型一维数组 
# @return int整型
#
class Solution:
    def maxArea(self , height ):
        tempaer = 0
        maxtempaer = 0
        i = 0
        j = len(height) - 1
        if len(height) < 2:
            return None
        while i < j :
            tempaer = min(height[i], height[j]) * (j-i)
            if maxtempaer < tempaer:
                maxtempaer = tempaer
            if height[i] < height[j]:
                i += 1
            else:
                j -= 1
        return maxtempaer
S = Solution()
H = input()
H = H[1:-1]
H = list(map(int , H.split(',')))
print(S.maxArea(H))
        # write code here

给定n个非负整数a1,a2,…,an,其中每个数字表示坐标(i, ai)处的一个点。以(i,ai)和(i,0)(i=1,2,3...n)为端点画出n条直线。你可以从中选择两条线与x轴一起构成一个容器,最大的容器能装多少水?

题解:从两边向中间靠拢,得到面积的最大值,具体做法是,让i指向第一个数据,j指向最后一个数据,计算当前以第i个数据为左端点,第j个数据为右端点时形成的面积,依次让两个数据中的较小值向中间移动,每次计算当前面积并更新最大面积。
证明为什么这样可以找到最大值,假设第x个数据和第y个数据形成的容器是最大的,我们让i从第一个出发,j从最后一个出发,如果i到达x,j还大于y,这时一定有height[j]<height[i](下面证明这个不等式,假如height[j]>height[x],那么这时的面积是height[i](j-x),这个面积一定比最优时的面积min(height[x],height[y])(y-x)大,那么就与假设矛盾了)且还有height[j]<height[y],证明同前面的,这样我们每次让较小的向中间移动一定不会错过最优解。同理i还小于x,j已经到达y的情况也一样。

原文地址:https://www.cnblogs.com/nenu/p/14638420.html