[19/1]Python算法-已知两数合求两数

下周开始学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,是符合要求的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值