题目描述
解题
首先将数组进行排序,并确定第一个数(最小),第二第三分别取第一个数右边数组的第一nums[L]和最后一个数nums[R],第一个数必须小于0,
若第一个数与上一次循环的第一个数相同,则第一个数需要增大,否则会造成结果重复(注意,此处不可直接寻找相同数中的最后一个,因为会漏掉三个数中有其他数与第一个数值相等的情况)
接下来分为以下几种情况:
当L<R时,
- 三数相加小于0,L增大
- 三数相加大于0,R减小
- 三数相加等于0,append入数组,L增大,R减小
此时,当nums[L]与nums[L-1]相等,L继续增大(不能重复),R同理,减小
class Solution:
def threeSum(self, nums: List[int]) -> List[List[int]]:
re = []
if not nums:
return re
if len(nums)<3:
return re
i = 0
nums.sort()
while nums[i]<=0 and i < len(nums)-1:
if i>0 and nums[i-1] == nums[i]:
i += 1
continue
l = i + 1
r = len(nums) - 1
while l<r:
sum = nums[i] + nums[l] + nums[r]
if sum == 0:
re.append([nums[i],nums[l],nums[r]])
l += 1
r -= 1
while nums[l] == nums[l-1] and l<r:
l += 1
while nums[r] == nums[r+1] and r>l:
r -= 1
elif sum < 0:
l = l + 1
elif sum > 0:
r = r - 1
i += 1
return re