【数组 &双指针】Leecode-15. 三数之和
【摘要】 【题目】给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i != j、i != k 且 j != k ,同时还满足 nums[i] + nums[j] + nums[k] == 0 。请你返回所有和为 0 且不重复的三元组。注意:答案中不可以包含重复的三元组。 示例 1:输入:nums = [-1,0,1,2,-1,-4]输出:...
【题目】
给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i != j、i != k 且 j != k ,同时还满足 nums[i] + nums[j] + nums[k] == 0 。请
你返回所有和为 0 且不重复的三元组。
注意:答案中不可以包含重复的三元组。
示例 1:
输入:nums = [-1,0,1,2,-1,-4]
输出:[[-1,-1,2],[-1,0,1]]
解释:
nums[0] + nums[1] + nums[2] = (-1) + 0 + 1 = 0 。
nums[1] + nums[2] + nums[4] = 0 + 1 + (-1) = 0 。
nums[0] + nums[3] + nums[4] = (-1) + 2 + (-1) = 0 。
不同的三元组是 [-1,0,1] 和 [-1,-1,2] 。
注意,输出的顺序和三元组的顺序并不重要。
示例 2:
输入:nums = [0,1,1]
输出:[]
解释:唯一可能的三元组和不为 0 。
示例 3:
输入:nums = [0,0,0]
输出:[[0,0,0]]
解释:唯一可能的三元组和为 0 。
【题解】
题解1:
- 思路
双for循环,在j后面的数组查找和前面加起来等于零的目标target在不在里面,在排序后添加到结果中,注意去重
- 复杂度
时间复杂度:O(n2),空间复杂度:O(n)
- 代码
class Solution:
def threeSum(self, nums: List[int]) -> List[List[int]]:
n = len(nums)
ret = []
for i in range(n):
for j in range(i+1, n):
target = -(nums[i]+nums[j])
if target in nums[j+1:]:
temp = sorted([nums[i],nums[j],target])
if temp not in ret:
ret.append(temp)
return ret
题解2:
- 思路:
for + 双指针,先进行排序,for限制指针的范围,然后按照两数之和处理,注意去重
- 复杂度
时间复杂度:O(nlogn),空间复杂度:O(n)
- 代码
class Solution:
def threeSum(self, nums: List[int]) -> List[List[int]]:
nums.sort()
n = len(nums)
ret = []
for i in range(n):
if(nums[i]>0):
return ret
if(i>0 and nums[i]==nums[i-1]):
continue
j = i+1
k = n-1
while j<k:
if nums[i] + nums[j] + nums[k] == 0:
temp = sorted([nums[i],nums[j],nums[k]])
if temp not in ret:
ret.append(temp)
j += 1
k-=1
elif nums[i] + nums[j] + nums[k] < 0:
j+=1
else:
k-=1
return ret
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)