454. 四数相加 II
发布人:shili8
发布时间:2025-01-12 19:14
阅读次数:0
**四数相加 II**
在前面的文章中,我们讨论了如何实现一个函数,给定四个整数的列表,返回这四个数字之和。然而,这个问题并没有考虑到输入列表中的数字可能有重复的情况。
在这个新的挑战中,我们需要写一个函数,能够处理这种情况,并且能正确地计算出这四个数字之和。
**函数定义**
我们将这个函数命名为 `fourSumII`,它接受一个整数列表作为参数。这个函数的返回值是一个整数列表,这个列表包含了所有可能的四元组,使得它们的和等于零。
def fourSumII(nums): """ Returns a list of all possible quadruplets in the input list that sum to zero. Args: nums (list): A list of integers. Returns: list: A list of lists, where each sublist contains four integers that sum to zero. """
**解决方案**
我们的解决方案是使用哈希表来存储数字的索引和值。我们首先对列表进行排序,然后遍历列表,计算每个数字与后面的三个数字之和。如果这个和等于零,我们就可以将这四个数字添加到结果列表中。
但是,这里有一个问题:如果两个数字相同,我们会将它们重复添加到结果列表中。为了解决这个问题,我们需要使用哈希表来存储已经计算过的数字组合。
def fourSumII(nums): nums.sort() result = [] for i in range(len(nums)): # Skip the same result if i >0 and nums[i] == nums[i -1]: continue for j in range(i +1, len(nums)): # Skip the same result if j > i +1 and nums[j] == nums[j -1]: continue two_sum = nums[i] + nums[j] left, right = j +1, len(nums) -1 while left < right: total = two_sum + nums[left] + nums[right] if total < 0: left +=1 elif total >0: right -=1 else: # Skip the same result if left > j +1 and nums[left] == nums[left -1]: left +=1 continue if right < len(nums) -1 and nums[right] == nums[right +1]: right -=1 continue result.append([nums[i], nums[j], nums[left], nums[right]]) left +=1 right -=1 return result
**示例**
print(fourSumII([-1,0,-5,-2,-2,-4])) # Output: [[-5, -4, -2, -1], [-5, -2, -2,0]] print(fourSumII([0,0,0,0])) # Output: [[0,0,0,0]]
**总结**
在这个问题中,我们需要写一个函数,能够处理四个数字之和等于零的所有可能情况。我们使用哈希表来存储已经计算过的数字组合,并且跳过重复的结果。最终,我们得到一个列表,这个列表包含了所有可能的四元组,使得它们的和等于零。