思路:首先想到的也是双指针,但是第一次处理可能细节不太好,总是超时,后来用了另一种思路,将两个指针分开,然后去求,若大于则右指针左移,小于则相反。其中再做特殊化处理,比如去重,仅当符合条件后,将符合条件的重复的数移除。从运行来看这是一个非常笨重的办法。。。在这里插入代码片
import numpy as np
class Solution:
def threeSum(self, nums: List[int]) -> List[List[int]]:
res=[]
len_nums=len(nums)
if len_nums<3:return res
nums.sort()
for i in range(len_nums):
if nums[i]>0:return res
if i>0 and nums[i]==nums[i-1]:continue
left=i+1
right=len_nums-1
while left<right:
if nums[i]+nums[left]+nums[right]==0:
res.append([nums[i],nums[left],nums[right]])
#处理相同情况:
while left+1<right and nums[left]==nums[left+1]:left=left+1
while left<right-1 and nums[right]==nums[right-1]:right=right-1
#如果这次已经相等,又不允许有相同情况出现,故让左右指针都移动一个格
left=left+1
right=right-1
if nums[i]+nums[right]+nums[left]>0:
right=right-1
elif nums[i]+nums[right]+nums[left]<0:left=left+1
return res
另一附一个大佬的超级代码,说实话没太看明白。。。`留下来慢慢研究吧。。。
class Solution:
def threeSum(self, nums: List[int]) -> List[List[int]]:
ans = []
counts = {}
for i in nums:
counts[i] = counts.get(i, 0) + 1
nums = sorted(counts)
for i, num in enumerate(nums):
if counts[num] > 1:
if num == 0:
if counts[num] > 2:
ans.append([0, 0, 0])
else:
if -num * 2 in counts:
ans.append([num, num, -2 * num])
if num < 0:
two_sum = -num
left = bisect.bisect_left(nums, (two_sum - nums[-1]), i + 1)
for i in nums[left: bisect.bisect_right(nums, (two_sum // 2), left)]:
j = two_sum - i
if j in counts and j != i:
ans.append([num, i, j])
return ans`