探索“三数之和”问题的多语言解决方案
摘要
在本文中,我们将探讨解决“三数之和”问题的多种算法和编程语言实现。这个问题要求我们判断给定数组中是否存在三个不同的索引,使得对应元素之和为零,并返回所有这样的三元组。我们将分析几种不同的算法,并提供 Python、Java 和 C++ 的实现。
1. 问题描述
给定一个整数数组 nums
,判断是否存在三元组 [nums[i], nums[j], nums[k]]
满足 i != j
、i != k
且 j != k
,同时还满足 nums[i] + nums[j] + nums[k] == 0
。返回所有和为 0 且不重复的三元组。
2. 输入和输出格式
- 输入:整数数组
nums
- 输出:满足条件的三元组列表
3. 示例
- 示例 1:
nums = [-1,0,1,2,-1,-4]
输出:[[-1,-1,2],[-1,0,1]]
- 示例 2:
nums = [0,1,1]
输出:[]
- 示例 3:
nums = [0,0,0]
输出:[[0,0,0]]
4. 约束条件
3 <= nums.length <= 3000
-10^5 <= nums[i] <= 10^5
5. 算法分析
- 排序 + 双指针:首先对数组进行排序,然后使用双指针法从排序后的数组中找到和为零的三元组。
6. 多语言实现
我们将使用 Python、Java 和 C++ 来实现排序 + 双指针法。
Python 实现
def threeSum(nums):
nums.sort()
result = []
for i in range(len(nums) - 2):
if i > 0 and nums[i] == nums[i - 1]:
continue
left, right = i + 1, len(nums) - 1
while left < right:
total = nums[i] + nums[left] + nums[right]
if total < 0:
left += 1
elif total > 0:
right -= 1
else:
result.append([nums[i], nums[left], nums[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 result
# 示例
print<