题目链接在这里:Leetcode 11.盛最多水的容器
这是一道非常好的贪心题,用到了双指针。首先这个数据用dp很显然是要超时的,如果使用二分,前缀数组也没有什么思路,所以考虑用贪心,贪心的话需要用两个指针移动,考虑从两端向中间移动。
我们知道短板效应,因此水的多少和长板的长度关系不大。可以得出结论,如果将长板向内移动,结果肯定变小,但是如果把短板向内移动,结果可能变大也可能变小,因此每次贪心的将短板向中间移动就行了
如果要严密一点的证明的话就是,本来总共有 \({n \choose 2}\) 种选择方法,如果将短板向内移动,假设 \(h[i] < h[j]\) ,减少的是 \((i,j-1), (i,j-2),...,(i,i+1)\) 这些可能性,然而这些解都不如当前解,所以不影响结尾的正确性。
上面这个严密的证明是 \(Leetcode\) 上的题解
class Solution(object):
def maxArea(self, height: list) -> int:
n = len(height)
lft, rgt = 0, n-1
ans = 0
while (lft != rgt):
ans = max(ans, min(height[lft], height[rgt])*(rgt-lft))
if height[lft]<height[rgt]:
lft+=1
else:
rgt-=1
return ans
if __name__=="__main__":
h = [1,1]
ans = Solution.maxArea(self=0,height=h)
print(ans)
未来是什么样,未来会发生什么,谁也不知道。
但是我知道,
起码从今天开始努力,
肯定比从明天开始努力,
要快一天实现梦想。
千里之行,始于足下! ——《那年那兔那些事儿》