x轴上树立了n块木板,他们的高度为H[i],求任意两块木板和x轴组成的容器,盛水量最大是多少



1.贪心策略:

   从两段开始寻找盛水量最大值。定义两个指针i和j分别指向左端和右端,计算盛水量w =(j-i)*min(H[i],H[j]).然后指向短板的指针向内走一步,重新计算盛水量直到两指针相遇,取其中盛水量最大的作为最后的结果。

2.贪心选择性:

  为求盛水量的最大值,由于木桶的短板效应,放弃短板,向内寻找最大的盛水量。

  证明:

  盛水量的大小是和x轴距离和短板的长度的乘积决定的,为了获得更大的盛水量必须找到最大值。根据公式w =(j-i)*min(H[i],H[j])得,为求最大值时,指针向内移动,如果木板长度不改变,由于j和i之间的距离是变小的,盛水量必然是变小的,这和求最大值是矛盾的,为了避免这个必须选择更高的短板来弥补j和i之间距离变小带来的损失,必然选择更长的木板。

3.优化子结构:

  在寻找更大的盛水量的时候,min(H(j),H(i))是增大的,即两块木板之间高度的最小值是变大的。

  证明:

  假设两块木板中最小值是不变或者变小的,由于j-i即两块木板间的距离是变小的,所以盛水量是变小的,导致w =(j-i)*min(H[i],H[j])是变小的,这和目标是相矛盾的,所以为了获得更大的盛水量,两块木板之间的最小值是变大的。

4.伪代码:

  function maxWater

    maxWater = 0;  

i = 0

    j = H.length-1;  

while i<j

  if H(i)>=H(j)

    maxWater = maxWater>(j-i)*H(j)?maxWater:(j-i)*H(j)

    temp = j;

    while(H(j+1)<H(temp)) j++;

  else

    maxWater = maxWater>(j-i)*H(i)?maxWater:(j-i)*H(i)

    temp = i;

    while(H(i+1)<H(temp)) i++;

return maxWater;

5.算法复杂度:O(n)

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值