classSolution: defthreeSum(self, nums: List[int]) -> List[List[int]]: # 这题目和1. 两数之和很像,但本题target固定为0 # 这题目用hash table会变得复杂,使用双指针更简单 # 从左向右遍历,先固定一个数,如num[0],则num[1:]可以看成一个“两数之和”的问题,并且target变成0-num[0] L = len(nums) res = list() nums.sort() for index inrange(L): if nums[index] > 0: return res # 对于nums[index]来说, 跳过相同的数字 if index > 0and nums[index] == nums[index - 1]: continue
left = index + 1 right = L - 1 currentTarget = - nums[index] while left < right: # 计算双指针的和 currentSum = nums[left] + nums[right] if currentSum == currentTarget: res.append([nums[index], nums[left], nums[right]]) # 需要去重复 while right > left and nums[right] == nums[right - 1]: right -= 1 while right > left and nums[left] == nums[left + 1]: left += 1 # 记得修改条件 left += 1 right -= 1 elif currentSum < currentTarget: left += 1 else: right -= 1 return res
classSolution: deffourSum(self, nums: List[int], target: int) -> List[List[int]]: # 和三数之和相似,但可以用两层for循环,将原本需要O(n^4)降为O(n^3) res = list() L = len(nums) nums.sort() for i inrange(L): # 必须去重复,否则[2,2,2,2,2](输入),会输出[[2,2,2,2,2],[2,2,2,2,2],[2,2,2,2,2]] if i > 0and nums[i] == nums[i - 1]: continue # 提前退出[Optional] if nums[i] > target and nums[i] > 0and target > 0: break for j inrange(i + 1, L): # 必须去重复 if j > i + 1and nums[j] == nums[j - 1]: continue # 提前退出[Optional] if nums[i] + nums[j] > target and target > 0 break # 双指针 left = j + 1 right = L - 1 current_target = target - nums[i] - nums[j] while left < right: currentSum = nums[left] + nums[right] if current_target == currentSum: res.append([nums[i], nums[j], nums[left], nums[right]]) # 同样是为了去重复 while right > left and nums[right] == nums[right - 1]: right -= 1 while right > left and nums[left] == nums[left + 1]: left += 1 left += 1 right -= 1 elif currentSum < current_target: left += 1 else: right -= 1
classSolution: deffourSumCount(self, nums1: List[int], nums2: List[int], nums3: List[int], nums4: List[int]) -> int: # 统计 a+b+c+d = 0 出现的次数 res = 0 # key放a和b两数之和,value 放a和b两数之和出现的次数 table = dict() # 先计算nums1, nums2的排列组合可能的和 for i in nums1: for j in nums2: table[i + j] = table.get(i + j, 0) + 1 # for i in nums3: for j in nums4: if table.get(- i - j, 0): res += table[0 - i - j] return res