栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

python每日一练-三数之和

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

python每日一练-三数之和

我们先来看看今天的题目

当我看完这道题的时候,第一想法就是先将每一个三位数相加等于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

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

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/863990.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号