任务描述
思路
- 若数组中存在三个元素使a+b+c = 0,那么对于nums[i]来说,nums中存在两个数a,b,使得a+b+nums[i] = 0,因此存在两数之和等于0-nums[i]
- 所以定义两数之和的函数two_nums,用来寻找对于每个nums[i],是否存在这样两个数字a和b
- 注意去重,nums存在重复数字时,使用双指针来跳过重复项
- 对于nums[i]来说,满足条件的a、b可能不止一组,所以在two_num函数中注意定义清楚返回数据的类型及最终输出结果的数据类型
实现代码
class Solution:
def two_nums(self,target,nums):
ret =[]
i,j=0,len(nums)-1
while i <j:
temp=nums[i]+nums[j];
if temp<target:
i+=1
elif temp>target:
j-=1
else :
ret.append([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
return ret
def threeSum(self, nums: List[int]) -> List[List[int]]:
if not nums or len(nums) < 3:
return []
nums.sort()
i = 0
b = []
while i<len(nums)-2 and nums[i] <= 0:
twosum = self.two_nums(0-nums[i],nums[i+1:])
if twosum:
print(nums[i],twosum) #看看towum是啥,能不能直接append
for x in twosum:
b.append([nums[i]]+x)
i += 1
#去重
while i<len(nums) and nums[i]==nums[i-1]:
i+=1
return b