题目
给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组。
注意:答案中不可以包含(元素)重复的三元组。
例如, 给定数组 nums = [-1, 0, 1, 2, -1, -4],
满足要求的三元组集合为:
[
[-1, 0, 1],
[-1, -1, 2]
]
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/3sum
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解法一
-
思路
先将数组排序
定义三个指针:p1、p2、p3(p1<=p2<=p3)
其中p1遍历整个数组,那么这个问题就可以转化为在p1之后的数组中寻找合适的p2、p3,使得
nums[p2]+nums[p3]=-nums[p1]
若<,因为p3指向的数只会减少,所以p2增加;
同理,若>,p3减小
其中,若nums[p2]==nums[p2-1] 或nums[p3]==nums[p3+1],为使不出现重复的三元组,p2、p3也应移动 -
代码
class Solution:
def threeSum(self, nums: List[int]) -> List[List[int]]:
nums.sort()
res =[]
lens=len(nums)
for p1 in range(lens-2):
if p1>0 and nums[p1]==nums[p1-1]:
continue
p2=p1+1
p3=lens-1
while(p2<p3):
isum=nums[p1]+nums[p2]+nums[p3]
if isum==0:
res.append([nums[p1],nums[p2],nums[p3]])
p2+=1
p3-=1
while p2<p3 and nums[p2]==nums[p2-1]:
p2+=1
while p2<p3 and nums[p3]==nums[p3+1]:
p3-=1
elif isum<0:
p2+=1
else:
p3-=1
return res
- 结果
解法二(改进)
- 思路
其实p1只要到0点就可以结束循环了
若nums[p3]<=nums[p2]<=nums[p1]<0,
则sum必大于0 - 代码
class Solution:
def threeSum(self, nums: List[int]) -> List[List[int]]:
nums.append(1)
nums.sort()
k0=nums.index(1)
del nums[k0]
res =[]
lens=len(nums)
for p1 in range(k0):
if p1>0 and nums[p1]==nums[p1-1]:
continue
p2=p1+1
p3=lens-1
while(p2<p3):
isum=nums[p1]+nums[p2]+nums[p3]
if isum==0:
res.append([nums[p1],nums[p2],nums[p3]])
p2+=1
p3-=1
while p2<p3 and nums[p2]==nums[p2-1]:
p2+=1
while p2<p3 and nums[p3]==nums[p3+1]:
p3-=1
elif isum<0:
p2+=1
else:
p3-=1
return res
- 结果