双指针——盛最多水的容器(详细讲解)

一.题目

二,思路分析

对于本题,有两种方法:

常规法,构建两个循环嵌套,暴力算出每一种可能的盛水量,再选出最大值即可,但这种方法时间复杂度高,容易造成超时的问题。因此有了下面第二种方法。

双指针法:首先我们来看一下,假设输入的数组为[6,2,5,4],再构建两个变量left和right指向第一个数和最后一个数的下标,我们先计算此时的盛水量,为(right-left)*min(height[left],height[right]),然后,如果将left向右移动会怎么样呢,那么盛水量一定会变小,为什么呢,因为此时left指向的数字大于right,此时盛水量是由right以及两个数之间的宽度决定,而left向右移动,有两种结果,一是left对应的新数大于right对应的4(图中未给出),此时盛水量为4*(宽度),因为left向右移动了,所以宽度必然比原来小,因此盛水量减少,第二种是left对应的新数小于等于4,则此时盛水量为:新数*(宽度),易知这也是小于原来的盛水量,因此盛水量减少,所以得出结论,left往右移动盛水量一定会变少,所以left往右移动对应的所有可能都不用再去计算了,因此我们容易知道,应该把left和right两个中对应的数较小的向中间移动,才有可能使盛水量增大。

三.解题步骤

1.用left和right指向数组首位

2.计算此时的盛水量

3.将left和right所对应数较小的数向中间移动,如此反复,直到left与right相遇

四.代码

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值