11. 盛水最多的容器
问题描述
https://leetcode.cn/problems/container-with-most-water/description/
解题思路
首先,我们考虑暴力法。暴力法是O(n的平方).
然后对暴力法进行优化。我们发现了如下规律:
首先要记住,决定能盛多少水的,是短的那个板,而不是长的。
我们设定2个指针(首尾指针),我们发现了如下事实:
2个指针代表的数值,只有3种关系。
left > right
left < right
left == right
其实规划一下,我们可以整理成以下三种情况:
向内移动短板 ::结果有可能会变大,也可能会变小。
向内移动长板 ::结果一定会变小。
向内移动相等的板 ::结果一定会变小。
所以我们贪心的方向就是,向内移动短板。
这保证可以在O(n)的复杂度就能搞定。
代码
class Solution: def maxArea(self, height: List[int]) -> int: left, right = 0, len(height)-1 res = 0 while left < right: res = max(res, min(height[left], height[right])*(right-left)) if height[left] < height[right]: left += 1 else: right -= 1 return res