太久不做算法。自己真是太渣。最开始用了一个最傻逼的O(N^2),两层for循环做出来beta1.0 。代码略之
一点价值都木有,leetcode直接报runtimie out错误。
真是一点思路都没有啊。想过排序,但是觉得排好序又回来找太麻烦。后来想到python有神奇enumerate,再转化成dict,不就可以一层循环搞定了么。结果,自己写到一半又卡在一次查找value值上面。像c++的模板map有find函数,能直接查找target-value1的值。遂doc之,查了dict确实没有这个函数。没忍住,上网百度,看别人的思路和代码。终于历经一点磨难,做出了beta2.0 。
(这段是错误代码,勿模仿)
class Solution:
def twoSum(self, num, target):
num_len = len(num)
myDict = dict()
for i in xrange(num_len):
if not myDict.has_key(num[i]):
myDict[num[i]] = i
if myDict.has_key(target - num[i]):
return (myDict.get(target - num[i]) + 1, i + 1)
return None
自己运行。 哎,成功了。结果一拿上去,错了。当输入 [3, 2, 4]时,程序结果是1,1 显然不符合。
仔细一看最后糟糕了。当遍历的数字是target一半的时候中招,重复了。这好办呗,加一个判断条件就搞定啦。
<pre name="code" class="python">class Solution:
def twoSum(self, num, target):
num_len = len(num)
myDict = dict()
for i in xrange(num_len):
if not myDict.has_key(num[i]):
myDict[num[i]] = i
if myDict.has_key(target - num[i]) and i != myDict.get(target - num[i]): #different
return (myDict.get(target - num[i]) + 1, i + 1)
return None
运行。哈哈,accept了。
时间是 252ms,略渣。毕竟第一次嘛。咱过了就行!
后来再去看别人的思路,解法时,发现一个比我的更精简的代码。黏贴下来了哈。原文在此:传递门
class Solution:
# @return a tuple, (index1, index2)
def twoSum(self, num, target):
numMap = {}
alen = len(num)
array = [0, 0]
for i in range(alen):
if numMap.get(target - num[i]) != None:
array[0] = numMap.get(target - num[i]) + 1
array[1] = i + 1;
else:
numMap[num[i]] = i
return array
想说,自己还是太弱了。继续努力吧。加油!少年!