一般思路:
三重循环遍历,最后去重O(n^3)
双指针同时遍历:O(n^2)
先排序。
第一层循环:从左向右遍历第一个数a
第二层循环:a的右侧第一个数为初始b,最右侧数为初始c,分别被左右指针指示。
三数之和s<0:左指针++
s>0:右指针--
s=0:记录
剪枝:
只要第一个数a>0,则三数之和必定>0
去重:
可能重复的情况:
1. 左右指针移动后,指向的数值和原先相同
2. a的指针++后,指向的数值和原先相同
所以在左右指针移动后,以及a变化时进行判重。
class Solution:
def threeSum(self, nums: List[int]) -> List[List[int]]:
n = len(nums)
nums.sort()
result = []
for i in range(n - 2):
if nums[i] > 0: # 剪枝
break
if i > 0 and nums[i] == nums[i - 1]: # 去重
continue
left = i + 1
right = n - 1
while left < right:
s = nums[i] + nums[left] + nums[right]
if s < 0:
left += 1
elif s > 0:
right -= 1
else:
result.append([nums[i], nums[left], nums[right]])
# 去重:
while left < right and nums[left + 1] == nums[left]: # 这两个判定条件不能颠倒,否则left+1可能数组越界
left += 1
while left < right and nums[right - 1] == nums[right]:
right -= 1
left += 1
right -= 1
return result