三数之和
今天是小安开始Leetcode刷题的第15题,正文开始ing?
题目描述
给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组。
注意:答案中不可以包含重复的三元组。
题目原址
例如, 给定数组 nums = [-1, 0, 1, 2, -1, -4],
满足要求的三元组集合为:
[
[-1, 0, 1],
[-1, -1, 2]
]
方法:类快速排序
思路
开始的时候想使用嵌套循环来做,很悲伤地超时了。代码附下,作为经验
之后就得解决三重循环问题以及重复值问题
a.先对列表进行排序
b.给定第一个数nums[i]
c.从i之后首尾两端开始考虑三个元素累加值:若summ<0,则需要找更大的值,left++;
若summ>0,则需要找小一点的值,right–;若summ==0,则判断是否重复,before1和before2分别记录之前符合要求的首尾值,flag记录是否已经添加过
超时代码
class Solution(object):
def threeSum(self, nums):
"""
:type nums: List[int]
:rtype: List[List[int]]
"""
result=[]
nums.sort()
if len(nums)<3:
return []
le=len(nums)
for i in range(le):
for j in range(i+1,le):
for x in range(j+1,le):
if nums[i]+nums[j]+nums[x]==0:
result.append([nums[i],nums[j],nums[x]])
break
while j<le-1 and nums[j]==nums[j+1]:
j+=1
while i<le-1 and nums[i]==nums[i+1]:
i+=1
res=[]
for letter in result:#去除重复元素
if letter not in res:
res.append(letter)
return res
代码实现
【Python实现】
class Solution(object):
def threeSum(self, nums):
"""
:type nums: List[int]
:rtype: List[List[int]]
"""
result=[]
nums.sort()
if len(nums)<3:
return []
le=len(nums)
before1=0
before2=0
flag=-1
for i in range(le-2):
if nums[i]>0:
break
if i>0 and nums[i]==nums[i-1]:
continue
left=i+1
right=le-1
while left<right:
summ=nums[left]+nums[right]+nums[i]
if summ<0:
left+=1
elif summ>0:
right-=1
else:#summ=0
if flag==1 and before1==nums[left] and before2==nums[right]:#已存在
left+=1
continue
result.append([nums[i],nums[left],nums[right]])
left+=1
before1=nums[left]
before2=nums[right]
flag=1
return result