本文已参与「新人创作礼」活动,一起开启掘金创作之路。
本题考察数组相关知识,为中等题15.三数之和
15.三数之和
给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有和为 0 且不重复的三元组。
注意:答案中不可以包含重复的三元组。
示例 1:
输入:nums = [-1,0,1,2,-1,-4]
输出:[[-1,-1,2],[-1,0,1]]
示例 2:
输入:nums = []
输出:[]
示例 3:
输入:nums = [0]
输出:[]
提示:
0 <= nums.length <= 3000
-105 <= nums[i] <= 105
代码
会超时
class Solution:
def threeSum(self, nums: List[int]) -> List[List[int]]:
result = []
lens = len(nums)
for i in range(lens):
for j in range(i+1,lens):
a = nums[j+1:]
if -(nums[i]+nums[j]) in a:
result.append([nums[i],nums[j],-(nums[i]+nums[j])])
re1 = []
for re in result:
re.sort()
if re not in re1:
re1.append(re)
return re1
双指针
class Solution:
def threeSum(self, nums: List[int]) -> List[List[int]]:
if len(nums) < 3:
return []
nums.sort()
res = []
for i in range(len(nums)):
if nums[i] > 0:
return res #如果剩下的数列第一个数字就大于0
if i > 0 and nums[i] == nums[i-1]:
continue #避免重复
else:
L = i + 1
R = len(nums) - 1
while L < R:
if nums[i] + nums[L] + nums[R] == 0:
res.append([nums[i], nums[L], nums[R]])
while L < R and nums[L] == nums[L+1]:#找到最后一个和nums[L]相同的数
L += 1
while L < R and nums[R] == nums[R-1]:
R -= 1
L += 1
R -= 1
elif nums[i] + nums[L] +nums[R] < 0:
L += 1
elif nums[i] + nums[L] +nums[R] > 0:
R -= 1
return res
解析
我的小白思路当然是想到三层for循环,但是超时了,果然不是那么简单的,中等题就是有点难度哈。
具体方法:
1.先sort排个序,用for循环
2.循环里把L指向第一个数,R指向最后一个数
3.套一个while循环,如果nums[i] + nums[L] + nums[R] == 0,则放进去,然后L和R分别向后向前去找不重复的第一个数,接着while循环
4.for循环结束则输出
来源:力扣(LeetCode) 链接:leetcode.cn/problems/3s… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。