这道题最原始的方法应该是三重循环,这样子就能够遍历出三个数了。
但是这么看的话肯定会超时,我们可以看看,三个数的和是0,那么第三个数肯定是能够通过前两个数求出来的,因此,这样子就能够省去了一重循环,只要判定这个数存在,那么就可以用O(n^2)的时间复杂度做出来了。于是我写了下面的代码:s
原本的想法是搜寻一个最小的,一个最大的,剩下的就是中间的。
def threeSum(self, nums):
"""
:type nums: List[int]
:rtype: List[List[int]]
"""
dic = {}
for nu in nums:
dic[nu] = 1 if nu not in dic.keys() else dic[nu]+1
resu = []
arr = sorted(dic.keys())
for i in range(len(arr)):
key1 = arr[i]
if key1 > 0: break
dic[key1] = dic[key1] - 1
for j in range(i, len(arr)):
key2 = arr[j]
if key2 > (-key1+1)//2 : break
if dic[key2] == 0: continue
dic[key2] -= 1
key3 = 0 - key1 - key2
if key3 in arr and dic[key3] > 0 and key3 >= key2:
resu.append([key1,key2,key3])
dic[key2] += 1
dic[key1] += 1
return resu
这样子提交之后,错误肯定是没有错误的,但是却遇到了超时的问题。这时候,肯定需要对算法本身再进行优化才行了。
从网上找了很多相关的解题报告,把他们的Python代码丢进去,也都是超时,心很累。。如果有什么优化的xi想法再丢上来hao好了。