题目描述:
从一个list里找出和为0的三个数,结果不能包含重复值
注意:
①开始想到的都是从头开始匹配,时间复杂度为O(n^3),就超时了
解决:从两头来找
②从两头来找就可以固定两个数不变,只有一个数在变,就很好控制没有重复值这个条件
③第一个数的index循环的时候,要保证第一个数在之前的计算中未出现过,就是说如果nums[index]==nums[index-1],就继续index++
class Solution(object):
def threeSum(self,nums):
nums.sort()
res=[]
i=0
while i<len(nums)-2:
j=i+1;k=len(nums)-1
while j<k:
sum=nums[i]+nums[j]+nums[k]
#print nums[i],nums[j],nums[k]
if sum==0:
res.append([nums[i],nums[j],nums[k]])
#print i,j,k
if sum<=0:
t=j
while nums[t]==nums[j] and t<k:
t=t+1
j=t
if sum>=0:
t=k
while nums[t]==nums[k] and t>j:
t=t-1
k=t
t=i
while nums[t]==nums[i] and t<len(nums)-2:
t+=1
i=t
return res
if __name__=="__main__":
sol=Solution()
nums=[0,0,0,0]
ans=sol.threeSum(nums)
for i in range(0,len(ans)):
print ans[i]