我们先来看看今天的题目
当我看完这道题的时候,第一想法就是先将每一个三位数相加等于0的组合取出来,然后把每一个组合进行一次排序,放进一个列表中,那么如何消除重复的列表呢?这里我们想到了新建一个列表,然后遍历上面的列表,然后依次添加,如果遍历的值不在新列表中就进行元素添加。
根据这个思路呢,我们进行了程序的编写
nums = []
if len(nums)<3:
print([])
else:
list=[]
list_1=[]
for i in range(len(nums)):
for j in range(i+1,len(nums)):
for z in range(j+1,len(nums)):
if nums[i]+nums[j]+nums[z]==0:
list.extend([[nums[i],nums[j],nums[z]]])
new_list=[]
for i in list:
i.sort()
if i not in new_list:
new_list.append(i)
print(new_list)
后来仔细想想发现这种方法中间遍历组合的时候,消耗了太多的内存,是个效率非常低的方法。
然后我们又想到了双指针加排序的方法,有很多讲程序得总喜欢讲术语,这种对于小白及其不友好。
n=len(nums)#先求长度
res=[]
if(not nums or n<3):#如果nums为空或者长度小于3,直接返回【】
return []
nums.sort()#对列表进行排序
res=[]
for i in range(n):#遍历n
if(nums[i]>0):
return res
#首先我们要想如果最小的数都比0大那么我们直接返回res列表,res列表是要添加符合条件得列表
if(i>0 and nums[i]==nums[i-1]):
#如果有重复得数值,我们直接跳过,比如说i对应得是-1,我把后面所有相关得组合取完了,i+1还是-1,那么取得所有是和上方重复得,所以我们直接跳过
continue
L=i+1
#左边指针定位,右边指针也定位,分别处于i得下一位,和总长度得最后一位
R=n-1
while(L0):
#如果大于0,说明右指针对应得数太大了应该小一点,所以降低R
R=R-1
#如果小于0,说明左指针对应得数太小了应该大一点,所以提升L
else:
L=L+1
return res
以上标注得地方我们就把所有得情况都考虑在内了,可以看着代码注释我们仔细得考虑这种方法得思想。这就是所谓得双指针,利用一个循环完美解决问题。
春风得意马蹄疾,一夜看尽长安花!感谢各位大佬得赏脸观看,谢谢各位。



