双指针解决盛最多水容器问题(找到最大容量)

Problem:

    给定一个长度为 n 的整数数组height。有n条垂线,第 i 条线的两个端点是(i, 0)和(i, height[i])。
* 找出其中的两条线,使得它们与x轴共同构成的容器可以容纳最多的水。
* 返回容器可以储存的最大水量。
* 说明:你不能倾斜容器。

实例图解1:

 1.解法一:

        暴力算法:双重for循环遍历所有存在的矩形 找到最大容积  时间复杂度为n方

2.解法二:

        利用双指针确定矩形

        由题意我们可知 所求容积面积为

        设i为头指针   j为尾指针

        Area=(j-i)*Max(尾指针的高,头指针的高)

        所以问题就归到了指针如何移动,以及确定指针的位置的问题上来了

        当height[i]>height[j]时,如果移动头指针,由于尾指针不移动,那么围成的容积一定是不变或者减少的

        同理当height[i]<height[j]时,只有移动短的指针才有可能使面积增大

        因此得出 指针移动的方法为:不断向内移动短指针

代码解法:

public static int Solution(int[] height) {
        //求矩形的面积
        //比较任意两个下标围成的矩形面积
        //短边影响矩形的面积  area=短高*两下标的距离
        //i为左边的指针  j为右边的指针 res为两指针的容积
        int i=0,j=height.length-1,res=0;
        while (i<j){
             res=height[i]>height[j]?
                    Math.max(res,(j-i)*(height[j--])):
                    Math.max(res,(j-i)*(height[i++]));
        }
        return res;
    }

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值