python每日一练-三数之和

python每日一练-三数之和,第1张

我们先来看看今天的题目

当我看完这道题的时候,第一想法就是先将每一个三位数相加等于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(L<R):
                if(nums[i]+nums[L]+nums[R]==0):
                    res.append([nums[i],nums[L],nums[R]])
                    while(L<R and nums[L]==nums[L+1]):
                    #左指针有重复得,则左指针加一
                        L=L+1
                    while(L<R and nums[R]==nums[R-1]):
                    #右指针有重复得,则右指针减一
                        R=R-1
                    #如果相加都等于0了,那么左右指针各自进行移动,仔细想这块,是因为假设i=-1,目前L指针对应0,R指针对应1,如果这样,那么我单独移动L和单独移动R指针都会得到重复得解,所以我们同时移动
                    L=L+1
                    R=R-1
                elif(nums[i]+nums[L]+nums[R]>0):
                #如果大于0,说明右指针对应得数太大了应该小一点,所以降低R
                    R=R-1
                #如果小于0,说明左指针对应得数太小了应该大一点,所以提升L
                else:
                    L=L+1
        return res

以上标注得地方我们就把所有得情况都考虑在内了,可以看着代码注释我们仔细得考虑这种方法得思想。这就是所谓得双指针,利用一个循环完美解决问题。

春风得意马蹄疾,一夜看尽长安花!感谢各位大佬得赏脸观看,谢谢各位。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/873381.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-13
下一篇2022-05-13

发表评论

登录后才能评论

评论列表(0条)

    保存