leetcode 1.两数之和

话不多说,看注释。2104ms

class Solution:
    def twoSum(self, nums, target):
        #Q1,如何确定数字的下标 list.index(num)
        l = []
        for num in nums:
            #Q3,分片以避免[3,3]的情况
            nums2 = nums[nums.index(num) + 1:]
            if target - num in nums2:
                #Q2,检查num下标是否已在l内,防止循环找下标
                if nums.index(num) in l:
                    continue
                else:
                    l.append(nums.index(num))
                    l.append(nums.index(num) + nums2.index(target - num) + 1)
                    break
        return l

非常垃圾,只打败了18.38%的提交,明天没啥事,做完日常任务开始优化!

——2019/9/17 21:50 更新——

今天抄了四份答案,话不多说,看注释

ver2, 之前不太熟悉python列表的方法,走了一些弯路。不过,第二版代码也快不哪去。1744ms

class Solution:
    def twoSum(self, nums, target):
        #list.count() 统计列表中有多少个元素
        #list.index(num,start) 从start处开始寻找num
        len_nums = len(nums)
        for i in range(len_nums):
            if (target - nums[i]) in nums:
                if (target - nums[i] == nums[i]) & (nums.count(nums[i]) == 1):
                    continue
                else:
                    j = nums.index(target - nums[i], i + 1)
                    break
        return [i, j]

ver3。这个方法相对精妙了一些,减少了循环次数。1152ms

class Solution:
    def twoSum(self, nums, target):
        lens=len(nums)
        #为什么i要从1开始,若从0开始,nums2列表无意义
        for i in range(1,lens):
            nums2=nums[:i]
            if (target-nums[i]) in nums2:
                j=nums2.index(target-nums[i])
                break
        return [j,i]

ver4,使用字典加快速度。108ms

class Solution:
    def twoSum(self, nums, target):
        dict1={}
        #与ver3思想相同,换用字典
        for i,n in enumerate(nums):
            if dict1.get(target-n) is not None:
                return [dict1.get(target-n),i]
            dict1[n]=i
    

ver5,这种方法是最快的,只用了76ms

class Solution:
    def twoSum(self, nums, target):
        #enumerate(list) 构造一个enumerate对象
        #使用for index,num in enumerate(list),把下标及元素存入字典
        #如list=[2,5,8]
        #字典则为{2:0,5:1,8:2}
        dict1 = {}
        for i, n in enumerate(nums):
            dict1[n] = i
        for i, n in enumerate(nums):
            #问题在于,为什么dict.get()要比list.index()快?
            #我的猜想是,index()方法类似于
            # C语言中for(int i=0;i<len;i++) num[i]==dest?print(i)
            #而dict则使用了较为复杂的数据结构来构建
            j = dict1.get(target - n)
            if (j != None) & (j != i):
                return [i, j]

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值