三数之和
问题描述
给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i != j、i != k 且 j != k ,同时还满足 nums[i] + nums[j] + nums[k] == 0 。请你返回所有和为 0 且不重复的三元组。
注意:答案中不可以包含重复的三元组。
题目地址: https://leetcode.cn/problems/3sum/
解题代码
"""
双指针的方法
Reference: https://www.bilibili.com/video/BV1GW4y127qo/?share_source=copy_web&vd_source=11797d2715355519fb920653c1a14e31
"""
from typing import List
class Solution(object):
def threeSum(self, nums)->List[List[int]]:
"""
:type nums: List[int]
:rtype: List[List[int]]
"""
# 定义结果集
result = []
# 首先对 num 进行排序
nums.sort()
for i in range(len(nums)):
# print(result)
if nums[i] > 0 or len(nums)-i<3:
return result
elif i>0 and nums[i] == nums[i-1]:
continue
else:
left = i + 1
right = len(nums)-1
while left < right:
if nums[i]+nums[left]+nums[right] > 0:
right = right - 1
continue
elif nums[i]+nums[left]+nums[right] < 0:
left = left + 1
continue
else:
if left+1 == right:
result.append([nums[i],nums[left],nums[right]])
left = left + 1
right = right - 1
continue
elif left < right and nums[left] == nums[left+1]:
left = left + 1
continue
elif left < right and nums[right] == nums[right-1]:
right = right - 1
continue
result.append([nums[i],nums[left],nums[right]])
left = left + 1
right = right - 1
if __name__ == '__main__':
# nums = [-1,0,1,2,-1,-4]
# nums = [0,0,0,0]
# nums = [1,-1,-1,0]
# nums = [0,0,0]
nums = [-4,-2,-2,-2,0,1,2,2,2,3,3,4,4,6,6]
result = Solution().threeSum(nums)
print(result)