15. 3Sum
感觉如果没做过2Sum那一堆题目,即便是明确知道要用双指针的情况下,这题也不容易。我先去把2Sum的题基本都做了,再回来做的这道。
思路可以看作先固定一个数字之后执行 167. Two Sum II - Input array is sorted, 但是有个去重问题不好解决,先用set配合map函数在最后做了去重,但很慢。研究了一下在过程里去重也可以(line 7, 15, 16),就是思考的时候比较绕。
class Solution:
def threeSum(self, nums: List[int]) -> List[List[int]]:
if len(nums) < 3: return []
nums.sort()
res = set()
for i, n in enumerate(nums[:-2]):
l, r = i+1, len(nums)-1
while l < r:
cur = n + nums[l] + nums[r]
if cur > 0: r-=1
elif cur < 0: l+=1
else:
res.add((n, nums[l], nums[r]))
r -= 1
l += 1
return map(list, res)
12/29/2020 Update
如果要求不对 nums 进行 sort,如何解答?
本还是仍然是先固定一个元素,然后在剩下的里面找 2sum,但因为不 sorted 了,要以其他方式去重。即直接找 c,对每个候选 c 进行判断,0-a-c 是否存在于候选 b 中,是则记录解,不是就把该候选 c 当作候选b。
class Solution:
def threeSum(self, nums: List[int]) -> List[List[int]]:
n, res = len(nums), []
if n < 3: return res
A = set()
for i in range(n-2):
if nums[i] not in A:
diff = -nums[i]
B, C = set(), set()
for j in range(i+1, n):
if nums[j] not in A and nums[j] not in C:
if diff - nums[j] in B:
res.append([nums[i], diff-nums[j], nums[j]])
C.add(nums[j])
else:
B.add(nums[j])
A.add(nums[i])
return res
Last updated
Was this helpful?