lc15.三数之和
首先想法——哈希表
当然可以通过2层for循环得到sum的一部分,存到哈希表中,寻找target == 0 - sum
但这种方法去重太繁琐
利用双指针
重点在于去重逻辑
class Solution:
def threeSum(self, nums: List[int]) -> List[List[int]]:
res = []
#排序
nums.sort()
for i in range(len(nums)):
#如果a>0,由于已排序,不可能有符合条件的三个数
if nums[i] > 0:
return res
#对于a的去重,注意这里是i == i-1
#而非i == i+1,如果是这种写法,元组就无法有(-1,-1,2)这样符合了条件的情况
if i > 0 and nums[i] == nums[i-1]:
continue
left = i + 1
right = len(nums) - 1
while left < right:
sum_ = nums[i] + nums[left] + nums[right]
if sum_ < 0:
left += 1
elif sum_ > 0:
right -= 1
else:
res.append([nums[i],nums[left],nums[right]])
#对于b/c的去重,其实去重一个就行,因为另一个一定会自行移动
#当得到符合条件的三元组之后,left和right一定需要一起移动才可能满足条件了
while left < right and nums[left] == nums[left + 1]:
left += 1
while left < right and nums[right] == nums[right - 1]:
right -= 1
left += 1
right -= 1
return res
lc18.四数之和
class Solution:
def fourSum(self, nums: List[int], target: int) -> List[List[int]]:
res = []
nums.sort()
for i in range(len(nums)):
if nums[i] >= 0 and nums[i] > target:
return res
if i > 0 and nums[i] == nums[i-1]:
continue
for j in range(i+1, len(nums)):
if nums[i] + nums[j] > target and nums[j] >= 0:
break
if j > i+1 and nums[j] == nums[j-1]:
continue
left = j + 1
right = len(nums) - 1
while left < right:
the_sum = nums[i] + nums[j] + nums[left] + nums[right]
if the_sum > target:
right -= 1
elif the_sum < target:
left += 1
else:
res.append([nums[i],nums[j],nums[left],nums[right]])
while left < right and nums[left] == nums[left + 1]:
left += 1
left += 1
right -=1
return res