1. 题目描述
题目来源:力扣
给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有和为 0 且不重复的三元组。
注意:答案中不可以包含重复的三元组。
示例1, 输入:nums = [-1,0,1,2,-1,-4] 输出:[[-1,-1,2],[-1,0,1]]
示例2, 输入:nums = [] 输出:[]
示例3, 输入:nums = [0] 输出:[]
2. 题解
这道题目我是真不会,因此参考了其他资料,参见哈希表:解决了两数之和,那么能解决三数之和么?
算法步骤:
(1)将nums数组从小到大排序;
(2)i从0到len(nums)-2遍历,index_left=i+1,index_right=len(nums)-1
- 如果nums[i]+nums[index_left]+nums[index_right]=0,若未重复,放入结果存储, index_left++;
- 如果nums[i]+nums[index_left]+nums[index_right]<0, index_left++;
- 如果nums[i]+nums[index_left]+nums[index_right]>0, index_right--;
until index_left=index_right.
代码如下,
class Solution(object):
def threeSum(self, nums):
"""
:type nums: List[int]
:rtype: List[List[int]]
"""
if len(nums)<3:
return []
r = []
nums = sorted(nums)
for i in range(len(nums)-2):
index_left = i+1
index_right = len(nums)-1
while index_right != index_left:
# print("index_left", index_left)
# print("index_right", index_right)
s = nums[i] + nums[index_left] + nums[index_right]
if s == 0:
if [nums[i], nums[index_left], nums[index_right]] not in r:
r.append([nums[i], nums[index_left], nums[index_right]])
index_left += 1
elif s < 0:
index_left += 1
elif s > 0:
index_right -= 1
return r
if __name__ == '__main__':
s = Solution()
nums = [-1, 0, 1, 2, -1, -4]
r = s.threeSum(nums)
print(r)