自己思路:
1、分别从前、后遍历i,j,再另一个k遍历两个元素之间的值
2、判断是否有满足与nums[i]+nums[j]+nums[k]=0的元素,有的话加入列表mid
3、再将mid加入最后总的列表result
4、再对result去重
导致三重循环、还要额外进行去重,时间超出限制
class Solution(object):
def threeSum(self, nums):
"""
:type nums: List[int]
:rtype: List[List[int]]
"""
i = 0
len_nums = len(nums)
j = len_nums - 1
result=[]
mid=[]
while i < len_nums-2:
j = len_nums - 1
while j > i:
flag = 0 - (nums[i]+nums[j])
k = i+1
while k < j and k > i:
mid = []
# print("nums[i]:{},nums[j]:{},nums[k]:{}".format(nums[i],nums[j],nums[k]))
if nums[k]==flag:
mid.append(nums[i])
mid.append(nums[j])
mid.append(nums[k])
# print(mid)
result.append(mid)
k+=1
j-=1
i+=1
print(result)
# 去重
one={}
for x in result:
if str(sorted(x)) in one:
continue
else:
one[str(sorted(x))]=sorted(x)
print(one)
final_result=list(one.values())
print(final_result)
return final_result
看了一个精选解答:通过排序,减少相同值进行重复遍历;根据他的思路,自己理了一下,然后跟着写了代码,但是还是没有他的代码执行用时少,希望自己能学到东西,看了还是会有似懂非懂的感觉。
class Solution(object):
def threeSum(self, nums):
"""
:type nums: List[int]
:rtype: List[List[int]]
"""
# 1、排序
nums=sorted(nums)
# 记录三元组
i=0
len_nums=len(nums)
j=len_nums-1
k=0
result=[]
while k<len_nums-2:
# 如果第一个数>0
if nums[k]>0:
break
# 如果当前数字与上一个数相同,则该数字已查找过
elif k>0 and nums[k]==nums[k-1]:
k+=1
continue
# 其他情况
else:
i=k+1
j=len_nums-1
while i<j:
flag=0-nums[k]
if nums[i]+nums[j]>flag:
j-=1
while i<j and nums[j]==nums[j+1]:
j-=1
elif nums[i]+nums[j]<flag:
i+=1
while i<j and nums[i]==nums[i-1]:
i+=1
else:
mid=[]
mid.append(nums[k])
mid.append(nums[i])
mid.append(nums[j])
result.append(mid)
i+=1
j-=1
while i<j and nums[j]==nums[j+1]:
j-=1
while i<j and nums[i]==nums[i-1]:
i+=1
k+=1
print(result)
return result