Python实现三数之和:双指针算法与代码优化解析
本文详细解析Python解决三数之和问题的核心思路,采用排序结合双指针策略。文章对比了基础实现与修正后代码,重点指出并修复了循环边界、重复元素跳过逻辑及提前终止条件等常见错误,提供了完整的可运行代码与性能测试结果,帮助开发者掌握高效解题技巧。
三数之和题目描述
给定一个包含 n 个整数的数组 nums,需要判断其中是否存在三个元素 a、b、c,
使得 a + b + c = 0?请找出所有满足条件且不重复的三元组。
最终答案中不得包含重复的三元组。
示例:
给定数组 nums = [-1, 0, 1, 2, -1, -4],
满足要求的三元组集合为:
[
[-1, 0, 1],
[-1, -1, 2]
]思路
1. 首先对数组进行排序,可以使用Python内置的排序函数,也可以自定义排序算法。
2. 应用双指针算法。固定第一个数的索引 i,遍历整个数组,该数即为三元组中最小的数。随后在该数右侧设置左右两个指针 l 和 r,其中 l = i + 1,r = len(nums) - 1。
3. 判断这三个索引指向的元素之和与 0 的大小关系。
若和大于 0,右指针左移一位;若和小于 0,左指针右移一位。
为避免生成重复的三元组,在移动左右指针时,需要跳过所有相邻且相等的 nums[i]。
Python3代码
#导入计算时间的包,调用系统时间
from time import *
#初始时间
t1 = time()
def threeSum(nums):
nums.sort()
n = len(nums)
res = []
for i in range(n):
'''如果相邻的两个数相等,跳过,避免重复'''
if i > 0 and nums[i] == nums[i-1]:
continue
l, r = i+1, n-1
while l < r:
if nums[i] + nums[l] + nums[r]>0:
r -= 1
while nums[r+1] == nums[r]:
r -= 1
elif nums[i] + nums[l] + nums[r]<0:
l += 1
while nums[l-1] == nums[l]:
l += 1
else:
res.append([nums[i],nums[l],nums[r]])
l += 1
r -= 1
while nums[l] == nums[l - 1]: l += 1
while nums[r] == nums[r + 1]: r -= 1
return res
if __name__ == '__main__':
nums = [-1,0,1,2,-1,-4]
print(threeSum(nums))
#结束时间
t2 = time()
#运行时间
run_time = t2 - t1
print(run_time)
运行结果:
[[-1, -1, 2], [-1, 0, 1]] #运行时间 0.0010113716125488281
上述代码存在部分逻辑缺陷:
遗漏了对三个数全部大于 0 情况的处理,此时应直接退出循环,因为不存在满足条件的结果。
未严格判断每次循环中 l < r 的条件。
修正后的代码:
from time import *
t1 = time()
def threeSum(nums):
nums.sort()
n = len(nums)
res = []
for i in range(n-2):
if nums[i] > 0:break
'''如果相邻的两个数相等,跳过,避免重复'''
if i > 0 and nums[i] == nums[i-1]:
continue
l, r = i+1, n-1
while l < r:
if nums[i] + nums[l] + nums[r]>0:
r -= 1
while l < r and nums[r-1] == nums[r]:
r -= 1
elif nums[i] + nums[l] + nums[r]<0:
l += 1
while l < r and nums[l] == nums[l-1]:
l += 1
else:
res.append([nums[i],nums[l],nums[r]])
l += 1
r -= 1
while l < r and nums[l] == nums[l - 1]: l += 1
while l < r and nums[r] == nums[r + 1]: r -= 1
return res
if __name__ == '__main__':
nums = [-2,-3,0,0,-2]
print(threeSum(nums))
t2 = time()
run_time = t2 - t1
print(run_time)
结果:
[] #时间 0.0
以上为个人经验,希望能给大家一个参考,也希望大家多多支持本站。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













