LeetCode 哈希表四数之和去重(排序 + 双指针)解题分析及代码实现
在 LeetCode 中,四数之和是一个经典的算法问题。题目要求找出所有唯一且不同的四元组,使得这四个数字的和等于一个给定的目标值。去重是解决此类问题的关键,尤其是在存在重复元素的情况下。本文将围绕“哈希表四数之和去重”这一主题,结合排序和双指针技术,详细分析并实现一个高效的解决方案。
问题分析
给定一个整数数组 `nums` 和一个目标值 `target`,找出所有唯一且不同的四元组,使得这四个数字的和等于 `target`。注意,每个元素在四元组中只能使用一次,且四元组的顺序可以任意。
输入:
nums = [1, 2, 2, 2, 3, 4, 4, 5, 5]
target = 9
输出:
[[1, 2, 3, 4], [1, 2, 4, 2], [2, 2, 3, 2], [2, 2, 4, 1], [2, 3, 2, 2], [2, 3, 4, 0], [2, 4, 2, 1], [3, 2, 2, 2], [3, 2, 4, 0], [3, 4, 2, 0], [4, 2, 2, 1], [4, 2, 3, 0], [4, 3, 2, 0]]
注意事项:
1. 结果中的四元组必须唯一,即不允许重复的四元组。
2. 四元组的顺序可以任意。
解题思路
为了解决这个问题,我们可以采用以下步骤:
1. 排序:首先对数组进行排序,这样我们可以利用双指针技术来减少不必要的重复计算。
2. 去重:在遍历数组的过程中,跳过重复的元素,确保四元组的唯一性。
3. 双指针:对于每个固定的第一个元素,使用双指针来寻找剩下的三个元素,使得它们的和等于 `target - nums[i]`。
代码实现
下面是使用 Python 实现的代码:
python
def fourSum(nums, target):
nums.sort() 排序
result = []
for i in range(len(nums) - 3):
跳过重复的元素
if i > 0 and nums[i] == nums[i - 1]:
continue
for j in range(i + 1, len(nums) - 2):
跳过重复的元素
if j > i + 1 and nums[j] == nums[j - 1]:
continue
left, right = j + 1, len(nums) - 1
while left < right:
current_sum = nums[i] + nums[j] + nums[left] + nums[right]
if current_sum == target:
result.append([nums[i], nums[j], nums[left], nums[right]])
left += 1
right -= 1
跳过重复的元素
while left < right and nums[left] == nums[left - 1]:
left += 1
while left < right and nums[right] == nums[right + 1]:
right -= 1
elif current_sum < target:
left += 1
else:
right -= 1
return result
测试代码
nums = [1, 2, 2, 2, 3, 4, 4, 5, 5]
target = 9
print(fourSum(nums, target))
总结
本文通过分析 LeetCode 中的四数之和问题,结合排序和双指针技术,实现了一个高效的去重解决方案。在实现过程中,我们注意了去重和排序的细节,确保了结果的正确性和效率。通过这种方式,我们可以更好地理解和应用哈希表、排序和双指针等算法技术。
Comments NOTHING