记录刷题 2024/06/21
15. 三数之和
给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i != j
、i != k
且 j != k
,同时还满足 nums[i] + nums[j] + nums[k] == 0
。请
你返回所有和为 0 且不重复的三元组。
注意:答案中不可以包含重复的三元组。
时间复杂度O(n^2)
直接贴代码和注释
class Solution:
def threeSum(self, nums: List[int]) -> List[List[int]]:
nums.sort() #先排序 TimeSort O(nlog n)
res = []
for i in range(len(nums)): # 开始从前往后遍历
if nums[i] >0:
break
if i >0 and nums[i] == nums[i-1]: # 相同元素跳过
continue
left = i+1 # 左指针
right = len(nums) -1 # 右指针
while right > left: # 必须保证这一点,否则当一端数过大时,left就会一直加,或者 right就会一直减
num_sum = nums[i] + nums[left] + nums[right] # 求和
if num_sum <0: # 和小于0 left右移
left +=1
elif num_sum >0: # 和大于0 right 左移
right -=1
else:
res.append([nums[i], nums[left] , nums[right]])
# 消除重复数据
while right > left and nums[left] == nums[left+1]:
left +=1
while right > left and nums[right] == nums[right -1]:
right -=1
# 下一轮遍历计算
left +=1
right -=1
return res