11. Container With Most Water python3

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 and n is at least 2.

给定n个非负的整数a1,a2 ……an, 其中每个代表一个点坐标(i, ai)。一共n个垂直线段, 从每个坐标到x轴的垂线。找到两个线段,与X轴形成一个容器,使其能盛最多的水。注:不能倾斜容器并且n>=2.

因此就是如何用x轴和两条y轴构建最大面积长方形的问题。即:max{ (j-i) * min{hight[i], hight[j]} }.整体面积受到两根线之间的距离(j-i) 和最短那根线的高度的限制。

1. 两重for循环遍历所有情况,求得最大面积。

代码如下:

提交之后,出现时间超过限制的错误。如下图。

超过时间限制有两方面原因:死循环和迭代时间过长。

检查了一下,肯定没有死循环,那就是迭代时间过长咯。

可以看出,代码的时间复杂度为O(n**2),使用出错时的50个元素的list作为输入,测试运行时间(time.clock()):

运行时间超过9s。


2. 两个指针的方法

如图,想要最大化矩形的面积,必须最大化宽和高。以x轴之间的距离为宽,两根线中最短线长为高。若一共有6条线,则宽最大为5,此时构成矩形只有一种情况:矩形面积为3*5 = 15。若想要构成其它长方形,则必须缩短宽度,若宽度为4,有两种情况,矩形面积分别为:4*4 = 16 和 3*4 = 12。可以看出,一种将短边向左移,在牺牲宽度的情况下,高度得到了提升。另一种将长边右移,同样牺牲宽度的情况下,高度仍然被短边限制,即使移动到了高度为8。以此类推,在不得不牺牲宽度的情况下(宽度每次只减1),应该尽量移动短边,使其有更大的可能变高从而增大矩形面积。

代码如下:

你可能感兴趣的:(11. Container With Most Water python3)