写这篇文章的初衷,主要是为了让自己记住一个“惭愧的时刻”,下面我会提到(吐舌头~~~)
这个知识点源自于一道题,题目大概的意思是,给定一个整数数组,返回两个数字的索引,使它们加起来等于一个特定的目标值。并且相同的元素不能使用两次。
先说一下大致思路:
先sorted排序,这里是从小到大排的;
接着用循环遍历新列表,从第一个元素开始分别用目标值减;
然后用减得的数值和剩下的元素比较,若相等便返回两个元素下标。
最初的代码
import time
target = 12
ListA = [7,13,3,5]
StartTime = time.time()
# 排序
SortList = sorted(ListA)
# 从第一个元素开始用目标值减
# 查找剩下元素是否有等的
for i in SortList:
num = target - i
SortList.remove(i)
for j in SortList:
if j == num:
indexA = ListA.index(j)
indexB = ListA.index(i)
Index = [indexA,indexB]
EndTime = time.time()
print EndTime - StartTime
运行结果: [3, 0]
运行时间: 3.73000001907
改进后
还是先说思路:
定义一个空字典;
接着用枚举来遍历列表元素的值和下标,并用目标值减遍历得到的元素值;
然后把减得的差值添加到空字典中,并进行比较,比较有相同值返回对应的下标即可。
其实前后主体思路都差不多,只是形式由列表变为字典,并引用的枚举方法。
改进代码
class Function:
def Sum(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: List[int]
"""
Dict = {} # <type 'dict'>
for index, value in enumerate(nums):
n = target - value
if n not in Dict:
h[value] = index # 不是赋值是字典添加
else:
return [Dict[n], i]
ListA = [7, 12, 3, 6]
import time
StartTime = time.time()
Function().Sum(ListA, 10)
EndTime = time.time()
print EndTime - StartTime
这里我要特别说一个地方,就是if判断下面的 h[num] = i 这一行,注意,这里是字典的添加,不是赋值噢~
我刚开始的时候有点被带跑偏,好久没转过弯,惭愧惭愧~~~(惭愧的时刻”吐舌头~~~)
运行结果: [0, 2]
运行时间: 0.00699996948242
这道题来看,enumerate方法好像是比纯代码效率高,但是据我有限的经验,我没在项目中见过enumerate的使用~~~~
哈哈,不过有兴趣的朋友可以试试,用 enumerate大量运用在项目里,我目前还没用过^^~~~~
如果有什么惊人的效果求分享~~~