此题解采用排序加双指针的方法解决三数之和问题。首先对数组进行排序,然后使用外层循环遍历每个数作为可能的三元组中的第一个数。对于每个选定的第一个数,使用内层的双指针来查找剩余两个数。如果三个数的和为零,则记录这个组合。为了避免重复的三元组,每次在找到有效的三元组后,需要跳过相同的数。同时,如果当前的数大于0,则可以直接终止循环,因为不可能再找到和为零的三元组。
时间复杂度: O(n^2)
空间复杂度: O(1)
class Solution:
def threeSum(self, nums: List[int]) -> List[List[int]]:
n = len(nums)
nums.sort() # 对数组进行排序
ans = [] # 用于存放结果的列表
for i in range(n - 2): # 遍历到倒数第三个元素即可
if nums[i] > 0:
break # 如果当前数字大于0,终止循环
if i > 0 and nums[i] == nums[i - 1]:
continue # 跳过重复的数字,避免重复解
l = i + 1 # 左指针
r = n - 1 # 右指针
target = -nums[i] # 目标值为当前数的相反数
while l < r: # 双指针遍历
tmp = nums[l] + nums[r] # 计算两指针指向值的和
if tmp == target: # 如果和为目标值
ans.append([nums[i], nums[l], nums[r]]) # 添加到结果中
while l < r and nums[l + 1] == nums[l]:
l += 1 # 跳过重复值
l += 1
while l < r and nums[r - 1] == nums[r]:
r -= 1 # 跳过重复值
r -= 1
elif tmp > target:
r -= 1 # 和大于目标值,移动右指针
else:
l += 1 # 和小于目标值,移动左指针
return ans # 返回结果列表