目录
1.题目描述
给你一个整数数组 nums
,判断是否存在三元组 [nums[i], nums[j], nums[k]]
满足 i != j
、i != k
且 j != k
,同时还满足 nums[i] + nums[j] + nums[k] == 0
。请
你返回所有和为 0
且不重复的三元组。
注意:答案中不可以包含重复的三元组。
2.题目分析
对于这种数组的题目,我们可以首先想到用指针去做。然后这题是三元组,就首先想用三个指针去弄它。然后我们看题目是要和为0的整数数组,那么肯定必须要有整数和负数共同存在,或者全是0这种情况。于是我们就想到对数组进行排序,这样我们就可以根据数所在的位置来判断数的大小,然后可以使用一个外层循环 i
来遍历数组。由于数组已经排序,所以当 nums[i] > 0
时,可以直接停止遍历,因为后面的数都比 nums[i]
大,不可能再组成和为0的三元组。
3.代码实现
class Solution:
def threeSum(self, nums: List[int]) -> List[List[int]]:
n = len(nums)
res = [] # 初始化结果列表
if not nums or n < 3: # 如果数组为空或长度小于3,则直接返回空列表
return []
nums.sort() # 对数组进行排序
for i in range(n):
# 如果当前数字大于0,则由于数组已排序,不可能再找到三个数的和为0
if nums[i] > 0:
return res
# 跳过重复的数字,以避免结果重复
if i > 0 and nums[i] == nums[i - 1]:
continue
L = i + 1 # 左指针,初始化为当前数字后面的位置
R = n - 1 # 右指针,初始化为数组末尾
while L < R:
total = nums[i] + nums[L] + nums[R]
if total == 0:
res.append([nums[i], nums[L], nums[R]])
# 跳过重复的数字
while L < R and nums[L] == nums[L + 1]:
L += 1
while L < R and nums[R] == nums[R - 1]:
R -= 1
L += 1 # 移动左指针
R -= 1 # 移动右指针
elif total > 0:
R -= 1 # 如果和大于0,移动右指针
else:
L += 1 # 如果和小于0,移动左指针
return res
4.一丢丢吐槽
最近考试周,昨天少更新了一天,找机会补回来!
我有罪/(ㄒoㄒ)/~~,忏悔!