leetcode hot100 双指针:盛水最多的容器
题目
方法一:不需要动脑子,直接暴力解掉,此时的时间复杂度是n2。
class Solution:
def maxArea(self, height: List[int]) -> int:
res = 0
for i in range(len(height)):
for j in range(i + 1,len(height)):
cur_res = min(height[i],height[j]) * (j - i)
res = max(res,cur_res)
return res
很遗憾,在第50个测试用例时超时了
因此,要想一种时间复杂度低于n2的方法,通常来说,双层遍历我们应该第一时间就会想到双指针的方法,用某一个指针的移动来避免一些无用的重复遍历。
在这道题中,我们要找到盛水最多的情况。首先我们要想到计算水的体积应该是:两侧高度较低的一段 * 两端的坐标差。有了这一点,我们就可以判断,当两侧一高一低时,我们移动较高的一侧的指针是没有意义的,因为较低的一端决定了容器的最高高度,移动后两端点的差值也会变小,体积只可能是小于等于。因此,我们只需要移动每次两端点中较低的一端,去寻找下一个可能大于另一端点的高度,才有可能使容器的容积变大。因此,该题的做法就是设置两个指针在数组的两端,首先默认容器的底长最大,接着按照上述规则移动即可。
class Solution:
def maxArea(self, height: List[int]) -> int:
l = 0
r = len(height) - 1
res = 0
while l < r:
if height[l] >= height[r]:
cul_s = (r - l) * height[r]
r -= 1
else:
cul_s = (r - l) * height[l]
l += 1
res = max(cul_s,res)
return res
完结!通过!