leetcode11_Container With Most Water

来源:互联网 发布:北京行知实验小学追随 编辑:程序博客网 时间:2024/06/01 13:25

一.问题描述

Given n non-negative integers a1a2, ..., an, where each represents a point at coordinate (iai). n vertical lines are drawn such that the two endpoints of line i is at (iai) 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.


二.代码编写

暴力解法(即两层循环)在list较大的情况下会TLE,对本题的优化必须舍弃不必要的计算避免TLE。

算法思想:当木桶的宽度缩小时,必须增加高度才能获得更大的木桶容量。也就是说当宽度缩小,而高度未增高的情况是不必要考虑的。所以我们从两端开始往中间寻找,这就涉及到另一个问题,移动两端的哪一条垂直线呢?设想一下,如果移动的是两根中较长的那根,那么容量必然不会增加(因为宽度在减小,同时最高高度不会超过较短的那根)。因为往中间移动时,我们应当移动较短的那根。

具体代码如下:

class Solution(object):    def maxArea(self, height):        """        :type height: List[int]        :rtype: int        """        #solutionA: with time complexity of O(N^2)  -->TLE        #solutionB: with time complexity of O(N)        i=0        j=len(height)-1        max_con=min(height[i],height[j])*(j-i)        while i<j:            #移动高度较短的那根            if height[i]<height[j]:                hei=height[i]                i+=1                while i<j and height[i]<hei:                    i +=1                con=min(height[i],height[j])*(j-i)                if con>max_con:                    max_con=con            else:                hei=height[j]                j-=1                while j>i and height[j]<hei:                    j -=1                con=min(height[i],height[j])*(j-i)                if con>max_con:                    max_con=con        return max_con        


0 0