问题描述:
给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有和为 0 且不重复的三元组。
注意:答案中不可以包含重复的三元组
问题分析:1:不难想到转化成为两数之和的问题 -c=a+b
2:为了避免重复 先将原序列排序
例如 [-1,0,1,2,-1,-4]排序后[-4,-1,-1,0,1,2] 遍历数组每个元素 作为target(-c)
每次遍历就是求每一次新的target的两数之和问题
因而容易写出以下代码
class Solution: def threeSum(self, nums: List[int]) -> List[List[int]]: nums.sort() if len(nums)<3: return [] else: answer=[] for i in range(0,len(nums)-1): target=nums[i] for j in range(i+1,len(nums)-1): if -target-nums[j] in nums[j+1:]: tmp=[target,min(-target-nums[j],nums[j]),max(-target-nums[j],nums[j])] if tmp not in answer: answer+=[tmp] return answer
很遗憾 超时了 315/318
下面尝试利用双指针,进行优化分析:
class Solution: def threeSum(self, nums: List[int]) -> List[List[int]]: nums.sort() if len(nums)<3: return [] else: answer=[] for i in range(0,len(nums)-1): target=nums[i] if target>0: break start,end=i+1,len(nums)-1 while start<end: if nums[start]+nums[end]+target==0: tmp=[target,nums[start],nums[end]] if tmp not in answer: answer.append(tmp) start+=1 end-=1 elif nums[start]+nums[end]+target>0: end-=1 else: start+=1 return answer
我是小郑😀今天强化了双指针学习很高兴 期待与你一起进步