下周开始学Python算法,今天在学多线程,看到对面有个大哥在用3dsmax做室内建模(太强了,我只会做钻石的展台),深感不足,决定写篇笔记。
给定一个整数数列,找出其中两个元素,其和为某个特定值。
可以假设每个输入都只会有一种答案,这个数列内的元素不重复。
示例:给定 number = [3, 9, 6, 12], target = 9因为 nums[0] + nums[2] = 6 + 6 = 9所以返回这两个数的索引 [0,2]
只要求给出一组答案即可,返回的结果为两数的索引值组合成的数列。要求代码运行限制在3-5秒内。
大部人的第一想法应该都是两层for循环依次遍历,每次判断num[i],num[j]的合是否等于target(目标值),如果是则输出,如果不是则继续遍历直到是为止。
这种算法很好理解,毕竟初学都会,但是题目限制了代码运行的时间,依次遍历的速度其实是很慢的,运气好很快,但要是运气不好能运行个10s以上。
我们可以换个思路,将数列变成索引数列,只走一层循环,已知一个数只要判断target-x是否也存在这个数列内就行。
下面贴上代码。
import time
class numFind():
def twoSum(self,num,target):
for i,num in enumerate(nums):
sub_num = target - num
if sub_num in num:
j = nums.index(sub_num)
if j != i:
return [i,j]
nums = [x for x in range (0,30000,2)]
nums.sort(reverse = True)
target = 10000
numf = numFind()
start =time.clock()
two_sum = numf.twoSun(nums,target)
end = time.clock()
time0 = end - start
print(time0)
print(two_sum)
运行结果是
运行时间2.34s,是符合要求的。