其实是很简单的题目,但是还是写了很久,每次都是因为代码超时,如果从原理上看,自我感觉还是比较良好,觉得没问题,为什么提交通不过勒。当时的提交结果,自己试了不同的nums都没问题,但是就是超时。不过也开始因为这个问题才开始意识到程序好耗时的问题。之前都是直接写了完事,电脑跑去吧,然后自己就等待,没有想到可以改进,将时常缩短,遇到这个问题真的很好。
附上原来的代码(错误示范),现在想想,很多步骤好浪费资源。
class Solution:
def twoSum(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: List[int]
"""
for i in range(len(nums)):
for j in range(1,len(nums)):
if nums[i]+nums[j] == target and i!=j :
return i,j
一开始本来想的是i从头开始,j从i的后面开始遍历,然后不知道怎么写才能这样设置。这一开始的逻辑是对的,而且觉得也不会浪费。只是笨蛋的自己,只会range(n),所以就换路子,还设置i !=j。python2中不等于可以是<>,python3中不等于改成!=。现在想想好笨啊,就是不会写range(i+1,n)。苦笑。
一直超时,后来将j遍历的range修改了,判断条件修改为:target - nums[i] == nums[j],发现还是超时。怎么也找不到原因,参考了别人的才发现不是判断条件顺序问题,别人写的加了break,如果找到满足条件就输出,不用全部都找一遍,后面全都是浪费,如果前两个就满足就输出,不然后面全都浪费。
class Solution:
def twoSum(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: List[int]
"""
n=len(nums)
for i in range(n):
for j in range(i+1,n):
if nums[j] == target - nums[i]:
return i,j
break
else:
continue
虽然也是通过了,但是也是很慢。
苦笑。。。接下来继续找新的方法来加快。
所以juypter可以加一个扩展,计算每个cell的运行时间