Day 3 双指针- 双数和,三数和,接雨水

Day3

相向双指针—双数之和+三数之和+接雨水

思路:这个题目的思路是在数组的开头和结尾设立一个指针,一开始比较开头和结尾的大小(数组已经排序好了),如果大于目标数,舍弃最大的数继续进行比较,如果小于目标数,舍弃最小的数继续进行比较

还是比较好理解的,C++版本

三数之和

思路:将其转化为二数之和,枚举第一个数i,然后只要剩下两个数的和等于-i,就可以,题目不可以包含重复三元组,所以当后枚举的i与之前枚举的i相同时直接跳过此次枚举过程

值得注意的是:1.枚举的范围是从0到n-3,因为还要留两个数分配给j和k,而range函数是左闭右开,所以n-3+1=n-2,range(n-2)

2.判断枚举的数是否与前面一个数相同时,我们要加上i>0,因为第一个i是0,不可能有前面一个数,不加上i>0,会导致找不到-1这个下标而导致出错

3.将答案加入到ans列表中使用的是append函数,可以实现在列表中加入子列表

4.再发现符合答案的j和k时,此层枚举依然没有结束,因为j和k中间仍然存在着有正确答案的可能性,这时候再次将j向前移动,k向后移动,并且也要判断使是否与上一个数相同,避免得到重复结果,最后返回ans

三数之和的小优化

如果枚举的值和他后面紧接着的两个值加起来都大于0,那么不存在有找到等于0的情况,直接break

相同,如果枚举的值和最后两个数加起来都小于0,bane也不存在,那么直接枚举下一个x,也就是continue

接雨水

方法一:前后缀分解

思路:每个位置能接多少水,要求左边木板的高度和右边木板的高度,取最小值,而左边木板的最小值取决于左边各个数组的最大高度,因为高出这个高度的水回流出去,低于的则不会,同理右边木板的高度就是他右边所有数组的最大值

因此用两个数组来接收每个位置的左右两边最大高度,用小的那个减去这个位置数组的高大小就是能存放多少水的高度

代码部分

值得注意的是:zip函数

功能:多个列表同时遍历,如果打印出来,会把每次的值放进一个元组输出出来

优化:在方法一中可以发现,我们每次都是针对左右两个高度的较小值,所以我们可以不额外添加两个数组,而是通过两个指针放在首尾部,实时更新这两个指针的大小,代表目前的最大高度,然后将这两个指针的大小进行比较,找到更小的那个

代码部分

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值