盛最多水的容器

给定 n 个非负整数 a1,a2,...,an,每个数代表坐标中的一个点 (iai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (iai) 和 (i, 0)。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。

说明:你不能倾斜容器,且 n 的值至少为 2。

1. 题目需要理解的一点,垂直线的宽度忽略不计,也就是说width = n -1 

2. 一开始并没有什么好的方法,后来才意识到其实这题的关键在于隐藏信息

class Solution(object):
    def maxArea(self, height):
        """
        :type height: List[int]
        :rtype: int
        """
        max_area = 0
        length = len(height)
        x_tmp = -1
        y_tmp = -1
        for i in range(length-1):
            x = height[i]
            if x>x_tmp:
                y_list = [i for i in range(i+1,length)][::-1]
                for j in y_list:
                    y = height[j]
                    if y>y_tmp:
                        area = min(height[i],height[j])*(j-i)
                        if area>max_area:
                            max_area = area
                    else:
                        continue
            else:
                continue
        return max_area

 上述代码先从两端开始,因为宽度是逐渐减小的,因此必须使得高度是增加的,因此仅在后者高度大于前者,才计算area。

然而时间复杂度还是O(n*n),是不符合题目要求的。

 

正解:

其实是我们忽略了一个隐藏条件,因为根据短板效应,实际上我们需要增大的是短的那块板,因此还可以提高速度。

class Solution(object):
    def maxArea(self, height):
        """
        :type height: List[int]
        :rtype: int
        """
        
        max_area = 0
        
        left = 0
       
        right = len(height) - 1
        
        while right > left:
            max_area = max(max_area, min(height[left], height[right]) * (right - left))     
            if height[right] > height[left]:
                left += 1
            else:
                right -= 1
        return max_area

 

posted @ 2018-12-04 12:40  家迪的家  阅读(176)  评论(0编辑  收藏  举报