声明:
今天是中等题第8道题。给定一个包含 n 个整数的数组 nums
,判断 nums
中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组。以下所有代码经过楼主验证都能在LeetCode上执行成功,代码也是借鉴别人的,在文末会附上参考的博客链接,如果侵犯了博主的相关权益,请联系我删除
(手动比心ღ( ´・ᴗ・` ))
正文
题目:给定一个包含 n 个整数的数组 nums
,判断 nums
中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组。
注意:答案中不可以包含重复的三元组。
例如, 给定数组 nums = [-1, 0, 1, 2, -1, -4], 满足要求的三元组集合为: [ [-1, 0, 1], [-1, -1, 2] ]
解法1。只遍历整个num一遍,对每个元素都固定住,然后取它的相反数,再用双指针的方法求另外2个数,大致思路是这样,可以适当地简化,比如说只需要遍历负数,因为三数之和为0其中必然有负数,所以排序后只遍历负数(正数break),然后下一个数是相同的数的话就跳过(continue),代码如下。
执行用时: 1540 ms, 在3Sum的Python3提交中击败了22.09% 的用户
class Solution:
def threeSum(self, nums: List[int]) -> List[List[int]]:
if not nums:
return []
nums.sort()
if nums[0] > 0 or nums[-1] < 0:
return []
res = []
for i in range(len(nums)-2):
# 要break的分支优先放前面
if nums[i] > 0:
break
if nums[i] + nums[i+1] + nums[i+2] > 0:
break
if i > 0 and nums[i] == nums[i-1]:
continue
if nums[i] + nums[-1] + nums[-2] < 0:
continue
l = i+1
r = len(nums)-1
tar = 0 - nums[i]
while l < r:
tmp = nums[l] + nums[r]
if tmp == tar:
res.append([nums[i], nums[l], nums[r]])
while l < r and nums[l+1] == nums[l]:
l += 1
while l < r and nums[r-1] == nums[r]:
r -= 1
r -= 1
l += 1
elif tmp < tar:
l += 1
else:
r -= 1
return res