# # # @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的情况也一样。