话不多说,看注释。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]