leetcode container-with-most-water 最多水容器,详细完整数学证明

原题: https://leetcode.com/problems/container-with-most-water/

阅读solution和一些搜索出来的文章,但是都不是很清晰甚至缺漏的数学证明,在此提供一种完整的证明方式.

解题过程: 从数组两端的边开始,逐渐移动较短的一边往中间靠近,计算其所有每次移动产生的新面积,取其最大值则为题解。

关键疑问: 相对于暴力破解这种O(n2) 的解法,为什么他能剪去那么多枝叶从而达到O(n)级别算法。

a.设数组arr长度为n, 记arr[0] 与 arr[n-1] 组成的面积S[0][n-1],暂定为最大值S, 假设arr[0]<=arr[n-1]
**则不难有以下结论: **

	a1.若0和n-1之间存在下标x,且arr[x] <= arr[0] , 则arr[x] 和任意其他柱子的组合面积必然小于S[0][n-1].

根据该结论,则可以排除任何小于等于arr[0]的,在0和n-1之间的任何柱子。

b.保持选择arr[n-1],从arr[0]向右寻求arr[1]…arr[2]…arr[y]:

	b1: 当arr[y]小于等于arr[0],根据a1,可以直接跳过
	b2. 当arr[y]大于arr[0]且arr[y]小于等于a[n-1]时,  arr[y]与arr[n-1] 的 面积S[y][n-1] 或  arr[y] 和arr[0] 的面积S[0][y] 为 arr[y]与任意柱子组合的最大值,又因为S[0][y]<S[0][n-1], 所以只需要计算S[y][n-1]与S比较取舍,计算后跳过。
	b3. arr[y]大于a[n-1], 至此arr[n-1]已经和arr[0]...ar[y]组合,而又因为arr[n-1]与arr[y] 与arr[n-1]之间柱子组合必然小于S[y][n-1],所以arr[n-1]组合的最大面积已找到,可以跳过arr[n-1].

c.以此类推,不断排除较短柱子,计算所有经历的面积取其最大值

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值