Python实现三数之和:双指针算法与代码优化解析

Luna
Luna
发布时间:2026-10-16| 5人浏览过
原创

本文详细解析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

以上为个人经验,希望能给大家一个参考,也希望大家多多支持本站。

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。