当前位置:首页>python>Python题库第2题:找出三数之和为零的数据

Python题库第2题:找出三数之和为零的数据

  • 2026-10-11 08:27:34
Python题库第2题:找出三数之和为零的数据

Python,速成心法

敲代码,查资料,问Ai

练习,探索,总结,优化

★★★★★博文创作不易,源码代码的过程中,如有疑问的地方,欢迎大家指正留言交流。喜欢的老铁可以多多点赞+收藏分享+置顶,小红牛在此表示感谢。★★★★★

Python打包教程07:还不会用--add-data参数,添加资源文件吗?

Python打包教程04:UPX安装与使用(减小.exe体积)

Python打包教程03:PyInstaller命令使用指南

Python教程:PyCharm安装过程中遇到的中英文对照表

和Python编程相关的,中英文对照词汇表

2025年Python和pycharm安装下载教程

Python零基础教程:小白入门自学知识点大纲

Python教程:找到字符串中最长回文子串(上海自来水来自海上)

1.三数之和(中等难度)题目描述:给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a, b, c,使得 a + b + c = 0?请找出所有不重复的三元组,并按升序返回。
注意:答案中不可以包含重复的三元组。示例
输入:nums = [-1,0,1,2,-1,-4]输出:[[-1,-1,2], [-1,0,1]]解释:(-1, -1, 2) 和为 0,(-1, 0, 1) 和为 0。注意 (-1, 0, 1) 和 (0, 1, -1) 视为重复,只保留一组。
输入:nums = [0,1,1]输出:[]解释:没有三个数的和为 0。
2.要求:时间复杂度 O(n²)(可接受)。空间复杂度 O(1)(不计输出存储)。不能使用 itertools.combinations 等现成组合库。
3.解题思路说明
3.1.排序:先将数组升序排序,这是使用双指针的基础,也方便去重。
3.2.固定第一个数:遍历索引 i 作为三元组的第一个元素(最小元素)。
跳过重复的 nums[i],避免结果中出现重复三元组。
小优化:如果当前最小三个数之和大于 0,则后续 i 更大,和只会更大,直接跳出循环。
如果当前数和最大的两个数之和仍小于 0,则当前 i 不可能满足,直接跳过。
3.3.双指针查找:对于每个 i,令 left = i+1,right = n-1,目标为 -nums[i]。
若 nums[left] + nums[right] == target,记录三元组,并移动 left/right 跳过重复值。
若和小于目标,left++;否则 right--。
3.4.去重保证:外层循环跳过重复的 nums[i]。
内层找到解后,跳过与当前 left/right 重复的相邻元素。
时间复杂度 O(n²)(外层 n 次,内层双指针总移动 O(n)),空间复杂度 O(1)(不计输出)。
该解法是“三数之和”问题的标准最优解,广泛用于面试。

↓ 完整源码如下 ↓

# -*- coding: utf-8 -*-# @Author : 小红牛# 微信公众号:wdPythondef three_sum(nums):    """    返回所有和为 0 的不重复三元组。    参数:        nums: List[int]    返回:        List[List[int]]: 三元组列表,每个三元组内部升序排列。    """    nums.sort()          # 先排序,便于去重和双指针    n = len(nums)    result = []    for i in range(n - 2):        # 跳过重复的第一个数        if i > 0 and nums[i] == nums[i - 1]:            continue        # 优化:如果当前最小三个数之和 > 0,后面不可能有解        if nums[i] + nums[i + 1] + nums[i + 2] > 0:            break        # 优化:如果当前数和最大两个数之和 < 0,跳过这个 i        if nums[i] + nums[n - 2] + nums[n - 1] < 0:            continue        left = i + 1        right = n - 1        target = -nums[i]        while left < right:            current_sum = nums[left] + nums[right]            if current_sum == target:                result.append([nums[i], nums[left], nums[right]])                # 跳过重复的 left                while left < right and nums[left] == nums[left + 1]:                    left += 1                # 跳过重复的 right                while left < right and nums[right] == nums[right - 1]:                    right -= 1                left += 1                right -= 1            elif current_sum < target:                left += 1            else:                right -= 1    return result# 测试用例if __name__ == "__main__":    print(three_sum([-1, 0, 1, 2, -1, -4]))   # [[-1, -1, 2], [-1, 0, 1]]    print(three_sum([0, 1, 1]))               # []    print(three_sum([0, 0, 0]))               # [[0, 0, 0]]    print(three_sum([-2, 0, 0, 2, 2]))        # [[-2, 0, 2]]    print(three_sum([-4, -2, -2, -2, 0, 1, 2, 2, 2, 3, 3, 4, 4, 6, 6]))    # 输出应包含多组不重复三元组    # [[-4, -2, 6], [-4, 0, 4], [-4, 1, 3], [-4, 2, 2], [-2, -2, 4], [-2, 0, 2]]

完毕!!感谢您的收看

------★★历史博文集合★★------

Python入门篇  进阶篇  视频教程  Py安装

py项目Python模块 Python爬虫  Json

Xpath正则表达式SeleniumEtreeCss

Gui程序开发TkinterPyqt5 列表元组字典

数据可视化   matplotlib   词云图Pyecharts

海龟画图PandasBug处理电脑小知识

自动化脚本编程工具NumPy CSVWeb

Pygame  图像处理  机器学习数据库

最新文章

随机文章