问题:给定一个长度为 n
的整数数组 height
。有 n
条垂线,第 i
条线的两个端点是 (i, 0)
和 (i, height[i])
。
找出其中的两条线,使得它们与 x
轴共同构成的容器可以容纳最多的水。
返回容器可以储存的最大水量。
说明:你不能倾斜容器。
思路:
定义两个指针i,j,分别指向头尾两端,对应高度为h[i],h[j],分为短板和长板。水槽可容纳的水的高度由两板中的短板决定,面积公式为S(i,j)=min(h[i],h[j])×(j−i),下一步无论移动哪个指针,都会使面积的底变短。
若向内移动短板,水槽的短板可能变大,因此下个水槽的面积可能增大 。
若向内移动长板 ,水槽的短板不变或变小,因此下个水槽的面积一定变小 。
class Solution(object):
def maxArea(self, height):
"""
:type height: List[int]
:rtype: int
"""
#超出时间限制
# list=[]
# for i in range(len(height)):
# for j in range(i+1,len(height)):
# a=min(height[i],height[j])*(j-i)
# list.append(a)
#
# return max(list)
list=[]
i=0
j=len(height)-1
while i<j:
s = min(height[i], height[j]) * (j - i)
list.append(s)
if height[i]>height[j]:
j = j - 1
else:
i=i+1
return max(list)
sol=Solution()
height=[1,8,6]
print(sol.maxArea(height))
不需要使用list,直接比较即可。
class Solution(object):
def maxArea(self, height):
res=0
i=0
j=len(height)-1
while i<j:
s = min(height[i], height[j]) * (j - i)
res=max(s,res)
if height[i]>height[j]:
j = j - 1
else:
i=i+1
return res