Given n non-negative integers a1, a2, ..., an, where each represents a point at coordinate (i, ai). n vertical lines are drawn such that the two endpoints of line i is at (i, ai) 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.
题目的中文意思是:
给定n个非负的整数a1, a2, …, an,(i, ai) and (i, 0)分别代表坐标(i, ai)。连接(i, ai) and (i, 0)画直线,共有n条。找出两条直线,使得两条直线与x轴形成的容器能够盛最多的水。
桶的容量取决于最短的木板,简书上有张好图片,分享给大家
解题的思路有这么两种:
暴力破解
双向指针
暴力破解的时候,使用双重 for 循环,将索引绝对值差和两值的最小值进行相乘,遍历所有的线,找到最大的面积
class Solution(object):
def maxArea(self, height):
"""
:type height: List[int]
:rtype: int
"""
max_are = 0
l = len(height)
for i in range(l):
for j in range(l):
if max_are <abs(j-i)*min(height[i],height[j]):
max_are = abs(j-i)*min(height[i],height[j])
return max_are
双向指针,指针从两边开始遍历,两条边将较小的替换成下一条,通俗讲就是,那条边短,就向中间靠拢,具体代码如下(随手敲的):
class Solution(object):
def maxArea(self, height):
"""
:type height: List[int]
:rtype: int
"""
max_are = 0
l = len(height)
beg ,end = 0 , l-1
while(beg != end):
result = (end-beg)*min(height[beg] , height[end])
if max_are<result:
max_are=result
if height[beg] < height[end]:
beg = beg+1
else:
end = end-1
return max_are
最终结果:: Accepted