(leetcode刷题)
三数之和
题目: 给定一个包含n
个整数的数组nums
,判断nums
中是否存在三个元素a,b,c
,使得a+b+c=0
。找出所有满足条件且不重复的三元组。答案中不可以包含重复的三元组。
示例: 给定数组nums=[-1, 0, 1, 2, -1, -4]
,返回的之为[[-1, 0, 1],[-1, -1, 2]]
方法:双指针+排序
- 最直接的想法就是先排序,再两层循环,结果时间太久。看了题解是排序跟双指针的解法。(敬仰下大神)。他的中心思想是确定一个数,另外两个数分别在这个数的右侧和数组最右侧寻找(排序后),大于0就将数组最右侧的指针向左移动,小于0就将这个数旁边的指针向右移动,直至寻找到或进入下一个循环。
def threeSum(nums):
lens = len(nums)
zeroList = []
if lens < 3:
return zeroList
nums.sort()
for i in range(lens):
if nums[i] > 0:
return zeroList
if nums[i] == nums[i - 1] and i>0:
continue
L = i + 1
R = lens - 1
while L < R:
if nums[L] + nums[R] + nums[i] == 0:
zeroList.append([nums[L], nums[R], nums[i]])
while L < R and nums[L] == nums[L + 1]:
L = L + 1
while L < R and nums[R] == nums[R - 1]:
R = R - 1
L = L + 1
R = R - 1
elif nums[i] + nums[L] + nums[R] > 0:
R = R - 1
else:
L = L + 1
return zeroList