三数之和
1.思路
三重循环后再去重,但是时间复杂度会达到O(n3),提交后无法通过测试用例。所以
犹豫不决先排序,步步逼近双指针。
2.解题方法
先对数组进行排序,然后固定一个数nums[k],然后再用两个指针分别指向k+1,len(nums)-1,在循环过程中要注意去除重复元素。另外还有一个隐藏的终止循环条件,即如果此时nums[k]>0,那么直接break。
3.Code
class Solution:
def threeSum(self, nums: List[int]) -> List[List[int]]:
nums.sort()
res=[]
k=0
for k in range(len(nums)-2):
#sort过后的数组num[k]指向最小的数,如果此时nums[k]>0,那么直接结束循环
if nums[k]>0:
break
#k>0防止下标越界,在循环过程中nums[k]==nums[k-1],直接跳过这个数字,因为他已经被处理过
if k>0 and nums[k]==nums[k-1]:
continue
i=k+1
j=len(nums)-1
while i<j:
if nums[k]+nums[i]+nums[j]==0:
res.append([nums[k],nums[i],nums[j]])
i+=1
j-=1
while i<j and nums[i]==nums[i-1]:
i+=1
while i<j and nums[j]==nums[j+1]:
j-=1
elif nums[k]+nums[i]+nums[j]<0:
i+=1
while i<j and nums[i]==nums[i-1]:
i+=1
else:
j-=1
while i<j and nums[j]==nums[j+1]:
j-=1
return res