可惜没如果=_=
时光的河入海流

题目链接在这里: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)

posted on 2023-03-21 15:58  珍珠鸟  阅读(12)  评论(0编辑  收藏  举报