返回
数组三数之和:寻找组成和为零的三个数
前端
2023-10-02 17:36:01
算法详解
三数之和问题可以用多种方法解决。其中,一种有效且常用的算法是排序 + 双指针法。它的基本思想是:
- 首先,将数组进行升序排列。
- 然后,选择一个元素作为基准元素。
- 接着,使用两个指针从基准元素的左右两侧向中间移动,同时计算三数之和。
- 如果三数之和等于零,则找到一个解。
- 如果三数之和小于零,则左指针向右移动。
- 如果三数之和大于零,则右指针向左移动。
- 重复步骤3-6,直到找到所有可能的解。
代码实现
def threeSum(nums):
"""
:type nums: List[int]
:rtype: List[List[int]]
"""
# 排序数组
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:
# 计算三数之和
sum = nums[i] + nums[left] + nums[right]
# 如果三数之和等于零,则找到一个解
if sum == 0:
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
# 如果三数之和小于零,则左指针向右移动
elif sum < 0:
left += 1
# 如果三数之和大于零,则右指针向左移动
else:
right -= 1
# 返回结果
return result
复杂度分析
该算法的时间复杂度为O(n^2),其中n是数组的长度。
结语
三数之和问题是一个经典算法问题,在许多领域都有广泛的应用。本文介绍了一种使用排序 + 双指针法来解决该问题的有效算法。掌握这种算法可以帮助您解决各种实际问题。