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函数
功能:多个列表同时遍历,如果打印出来,会把每次的值放进一个元组输出出来
优化:在方法一中可以发现,我们每次都是针对左右两个高度的较小值,所以我们可以不额外添加两个数组,而是通过两个指针放在首尾部,实时更新这两个指针的大小,代表目前的最大高度,然后将这两个指针的大小进行比较,找到更小的那个
代码部分