三数之和

Posted zhibei

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了三数之和相关的知识,希望对你有一定的参考价值。

题目:给定一个包含n个整数的数组nums,判断nums中是否存在三个元素a,b,c,使得a+b+c?找出所有满足条件且不重复的三元组。

注意:答案中不可以包含重复的三元组。

例如,给定数组nums=[-1,0,1,2,-1,-4],

满足要求的三元组集合为:

[

[-1,0,1],

[-1,-1,2]

]

解题思路:先对序列排序,因为要找三个数,每次遍历固定一个元素,然后根据三数之和调整其他两个数的位置,如果等于0,符合要求,若果大于0,小的数字右移,如果小于0,大的数字左移。遍历过程中注意跳过重复数字。

 1 class Solution:
 2     def threeSum(self, nums):
 3         """
 4         :type nums: List[int]
 5         :rtype: List[List[int]]
 6         """
 7         #先对数组排序
 8         nums.sort()
 9         count = len(nums)
10         collect = []
11         for i in range(count):
12             left = i+1
13             right = count-1
14             #避免重复找同一个数据
15             if i >0 and nums[i] == nums[i-1]:
16                 left +=1
17                 continue
18             #数据按小到大排列,每次选取nums[i],在其后寻找符合a + b + c = 0的两个数据
19             while left < right:
20                 sum = nums[i] + nums[left] + nums[right]
21                 if sum == 0:
22                     col = [nums[i],nums[left],nums[right]]
23                     collect.append(col)
24                     left+=1
25                     right-=1
26                     #循环中nums[i]已确定,当再确定1个数时,另一个数也确定,左右端任一端出现重复均可跳过
27                     while nums[left] == nums[left-1] and left < right:
28                         left+=1
29                     while nums[right] == nums[right+1] and left < right:
30                         right-=1
31                 if sum<0:
32                     #如果和小于0,小的数字右移增大
33                     left+=1
34                 elif sum > 0:
35                     #如果和大于0,大的数字左移减小
36                     right-=1
37         return collect

测试模块:

1 nums=[-1,0,1,2,-1,-4]
2 a=Solution.threeSum(1,nums)
3 print(a)

 

该算法还有待优化

以上是关于三数之和的主要内容,如果未能解决你的问题,请参考以下文章

最接近的三数之和--力扣

数组练习题:两数之和三数之和四数之和

LeetCode 16. 最接近的三数之和

15. 三数之和

代码随想录算法训练营第7天 | ● 454.四数相加II ● 383. 赎金信 ● 15. 三数之和 ● 18. 四数之和 ● 总结

LeetCode 15. 三数之和