python 双指针_python用双指针法解决容器盛水问题

今天遇到了一道题,题目的大致意思是输入给你一个含有数字元素的列表,各数字的大小表示容器的高度,要在其中选出两个元素得出它们的面积最大,这里的面积是由二者之间的索引距离和高度短板来决定的;例子的截图如下:

起初我用了暴力穷举的方法,然而提交结果的时候发现时间太长,无奈之下,看了一下大神们的解答过程,发现该题要使用双指针法进行,在该题就是在列表的两侧设立指针设左右的指针分别为i,j,两侧指针向中间靠近,直到二者遇见;由于面积是由二者的索引距离以及短板决定的,面积可表示如下:

所以非短板一侧向内靠近,由于高度由短板决定,而索引又较之前缩短,因此面积一定会变小,因此此时不能移动非短板,而移动短板则可能会变大;

以下是力扣网站的jyd作者的原话:

因此,向内收窄短板可以获取面积最大值。换个角度理解:

若不指定移动规则,所有移动出现的 S(i, j)S(i,j) 的状态数为 C(n, 2)C(n,2),即暴力枚举出所有状态。

在状态 S(i, j)S(i,j) 下向内移动短板至 S(i + 1, j)S(i+1,j)(假设 h[i] < h[j]h[i]

短板高度:相比 S(i, j)S(i,j) 相同或更短(<= h[i]<=h[i]);

底边宽度:相比 S(i, j)S(i,j) 更短。

了解了这些以后代码的编写就容易了许多:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值