您的位置:首页 > 其它

leetcode第一题two sum

2014-10-17 02:11 211 查看
太久不做算法。自己真是太渣。最开始用了一个最傻逼的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
想说,自己还是太弱了。继续努力吧。加油!少年!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: