算法升级之路(七)-盛最多水的容器

文章介绍了如何解决‘盛最多水的容器’问题,通过分析发现,最优策略是不断移动较小高度的线,直至两线重合,计算最小高度乘以宽度得到最大面积。代码展示了使用双指针方法实现的解决方案。

给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。

找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。

返回容器可以储存的最大水量。
原题链接: 盛最多水的容器

解题思路:
这道题乍一看没什么思路,用暴力循环的话太麻烦了,要从第一个循环剩下的所有,第二个循环剩下的所有,第三个。。。
我也是看了答案之后才明白怎么算,其实很简单。

这个盛水的面积= min(height[i],height[j])*(j-i);

从i=0 和j=heigh.length-1算起
在这个状态下只要挪动板子,(j-i)都是会变小

min(height[i],height[j] 只有变大才有机会变大

由于求的是最小值,那么只有最小值变大,面积才有变大的可能。
所以每次挪动最小的板子,直到两个板子重合,就能得出最大面积。

代码

 public int maxArea(int[] height) {
        int area = 0;
        int front =0;
        int backend =height.length-1;
        while(front!=backend){
          int   current =Math.min(height[front],height[backend])*(backend-front);
          if(current>area){
              area = current;
          }
          if(height[front]<height[backend]){
              front++;
          }else{
              backend--;
          }
        }
        return area;


    }

这个算法让我有种我当年上高中事,做题做不出,老师一讲就听懂了的感觉,梦回高三。
我啥时候才能到这种水平呀

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值