双指针法
即从左右两端开始扫描,若满足某种条件则会向中间移动,如此这样可以将复杂度从N2降至N
题意:每个点和X轴垂直,构成一个边,任选两个组成挡板储存水,求最多能储藏多少水。
分析:1、能放多少水由最短的板子决定。2、因为和位置有关,数据不能排序 3、暴力思维是枚举所有的情况,若想减少比较次数,第一反应是储存前面的最高?但是仍和两个板子间的距离有关,没有办法。
使用双指针,若左边板子高,计算此时的值和最大值。然后右边左移,此时减少的是右边板子的其余所有可能。因为右边板子的其余所有可能值都会比这个小。
class Solution(object):
def maxArea(self, height):
"""
:type height: List[int]
:rtype: int
"""
hlen=len(height)
if hlen<2:
return 0
l=0
r=hlen-1
ans=0
while l<r:
ans=max((r-l)*min(height[r],height[l]),ans)
if height[l]<height[r]:
l+=1
else:
r-=1
return ans