【力扣算法14】之 15. 三数之和 python

news2024/10/7 2:31:14

文章目录

  • 问题描述
    • 示例1
    • 示例2
    • 示例 3
    • 提示
  • 思路分析
  • 代码分析
  • 完整代码
  • 详细分析
  • 运行效果截图
    • 调用示例
    • 运行结果
  • 完结

问题描述

在这里插入图片描述

给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i != j、i != k 且 j != k ,同时还满足 nums[i] + nums[j] + nums[k] == 0 。请
你返回所有和为 0 且不重复的三元组。

**注意:**答案中不可以包含重复的三元组。

在这里插入图片描述

示例1

输入:nums = [-1,0,1,2,-1,-4]
输出:[[-1,-1,2],[-1,0,1]]
解释:
nums[0] + nums[1] + nums[2] = (-1) + 0 + 1 = 0 。
nums[1] + nums[2] + nums[4] = 0 + 1 + (-1) = 0 。
nums[0] + nums[3] + nums[4] = (-1) + 2 + (-1) = 0 。
不同的三元组是 [-1,0,1] 和 [-1,-1,2] 。
注意,输出的顺序和三元组的顺序并不重要。

示例2

输入:nums = [0,1,1]
输出:[]
解释:唯一可能的三元组和不为 0 。

示例 3

输入:nums = [0,0,0]
输出:[[0,0,0]]
解释:唯一可能的三元组和为 0 。

提示

  • 3 <= nums.length <= 3000
  • -105 <= nums[i] <= 105

思路分析

在这里插入图片描述

  1. 首先对数组进行排序,将数组从小到大排序,以便后续操作。
  2. 初始化一个空列表 res,用于存储符合条件的三元组结果。
  3. 开始遍历数组,以每个元素 nums[i] 作为基准。
  4. 在每次遍历中,使用两个指针 left 和 right 分别指向当前元素 nums[i] 的下一个元素和数组的最后一个元素。
  5. 在 left < right 的条件下,进行循环:
    • 计算三个数的和 total = nums[i] + nums[left] + nums[right]。
    • 如果 total 等于 0,说明找到了满足条件的三元组,将其加入结果列表 res 中。
      • 进一步避免重复计算:如果左指针所指的元素与下一个元素相等,则将左指针右移一位,直到不相等为止;同理,如果右指针所指的元素与前一个元素相等,则将右指针左移一位,直到不相等为止。
      • 将左指针右移一位,将右指针左移一位。
    • 如果 total 小于 0,说明三个数之和偏小,将左指针右移一位。
    • 如果 total 大于 0,说明三个数之和偏大,将右指针左移一位。
  6. 返回结果列表 res。

代码分析

在这里插入图片描述

  • 将数组进行排序,以方便后续的操作。
  • 初始化一个空列表 res ,用于存储结果。
  • 开始遍历数组,以每个元素 nums[i] 作为基准。
    • 如果当前元素与前一个元素相等,则跳过,以避免重复计算。
    • 初始化指针 left = i + 1 和 right = n - 1,其中 n 是数组的长度。
    • 在 left < right 的条件下,进行循环:
      • 计算三个数的和 total = nums[i] + nums[left] + nums[right]。
      • 如果 total 等于 0,说明找到了满足条件的三元组,将其加入结果列表 res 中。
        • 进一步避免重复计算:如果左指针所指的元素与下一个元素相等,则将左指针右移一位,直到不相等为止;
        • 同理,如果右指针所指的元素与前一个元素相等,则将右指针左移一位,直到不相等为止。
        • 将左指针右移一位,将右指针左移一位。
      • 如果 total 小于 0,说明三个数之和偏小,将左指针右移一位。
      • 如果 total 大于 0,说明三个数之和偏大,将右指针左移一位。
  • 返回结果列表 res。

完整代码

在这里插入图片描述

class Solution(object):
    def threeSum(self, nums):
        # 对数组进行排序
        nums.sort()
        n = len(nums)
        res = []

        # 遍历数组,以每个元素 nums[i] 作为基准
        for i in range(n):
            # 如果当前元素与前一个元素相等,则跳过,以避免重复计算
            if i > 0 and nums[i] == nums[i-1]:
                continue

            # 初始化指针 left 和 right
            left = i + 1
            right = n - 1

            # 在 left < right 的条件下,进行循环
            while left < right:
                # 计算三个数的和 total
                total = nums[i] + nums[left] + nums[right]

                # 如果总和等于 0,说明找到了满足条件的三元组
                if total == 0:
                    # 将三元组加入结果列表 res
                    res.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

                # 如果总和小于 0,将左指针右移一位
                elif total < 0:
                    left += 1

                # 如果总和大于 0,将右指针左移一位
                else:
                    right -= 1

        # 返回结果列表 res
        return res

详细分析

  • nums.sort():对输入的数组 nums 进行原地排序,使其按照升序排列。
  • n = len(nums):获取数组 nums 的长度,即元素个数。
  • res = []:创建一个空列表 res,用于存储符合条件的三元组结果。
  • for i in range(n)::遍历数组 nums,以每个元素 nums[i] 作为基准。
  • if i > 0 and nums[i] == nums[i-1]: continue:如果当前元素与前一个元素相等,则跳过循环,以避免重复计算。
  • left = i + 1:初始化指针 left,指向当前元素的下一个位置。
  • right = n - 1:初始化指针 right,指向数组的最后一个元素。
  • while left < right::在 left < right 的条件下,进行循环。
  • total = nums[i] + nums[left] + nums[right]:计算三个数的和 total
  • if total == 0::如果总和等于 0,说明找到了满足条件的三元组。
    • 将三元组 [nums[i], nums[left], nums[right]] 加入结果列表 res
    • 进一步避免重复计算:将左指针右移一位,直到不与下一个元素相等。
    • 进一步避免重复计算:将右指针左移一位,直到不与前一个元素相等。
    • 将左指针右移一位,将右指针左移一位。
  • elif total < 0::如果总和小于 0,将左指针右移一位。
  • else::如果总和大于 0,将右指针左移一位。
  • return res:返回结果列表 res

运行效果截图

调用示例

solution = Solution()
nums = [-1,0,1,2,-1,-4]
nums1 = [0,1,1]
print(solution.threeSum(nums))
print(solution.threeSum(nums1))

运行结果

在这里插入图片描述

完结

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/775646.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

python编程语言之数据类型进阶操作

数值常用操作 python常用关于数值&#xff0c;数学常用的模块&#xff1a;math&#xff08;数学&#xff09;&#xff0c;random&#xff08;随机&#xff09;&#xff0c;numpy&#xff08;科学计算&#xff09;&#xff0c;pandas&#xff08;数据读写&#xff0c;数据分析&…

Yalmip入门教程(3)-约束条件的定义

博客中所有内容均来源于自己学习过程中积累的经验以及对yalmip官方文档的翻译&#xff1a;https://yalmip.github.io/tutorials/ 之前的博客简单介绍了约束条件的定义方法&#xff0c;接下来将对其进行详细介绍。 首先简单复习一下&#xff1a; 1.定义约束条件可以使用矩阵拼接…

如何通过nvm管理多个nodejs版本

随着前端项目的越来越多&#xff0c;不同项目使用的nodejs版本可能不一样&#xff0c;导致在切换不同项目时需要更换不同的nodejs版本&#xff0c;非常麻烦。本次推荐使用nvm进行多个nodejs版本的统一管理。 1、nvm的下载 nvm全称Node Version Manager&#xff0c;即Node版本管…

科技政策 | 2023年广东省省级企业技术中心(第22批)认定开始啦!

原创 | 文 BFT机器人 原文链接&#xff1a; http://gdii.gd.gov.cn/zwgk/tzgg1011/content/post_4218083.html 各企业请注意&#xff0c;2023年广东省省级企业技术中心&#xff08;第22批&#xff09;认定已经开始了&#xff0c;广东省工业和信息化厅接收资料截止时间为2023年…

【Java基础教程】Java学习路线攻略导图——史诗级别的细粒度归纳,持续更新中 ~

Java学习路线攻略导图 上篇 前言1、入门介绍篇2、程序基础概念篇3、包及访问权限篇4、异常处理篇5、特别篇6、面向对象篇7、新特性篇8、常用类库篇 前言 &#x1f37a;&#x1f37a; 各位读者朋友大家好&#xff01;得益于各位朋友的支持和关注&#xff0c;我的专栏《Java基础…

Python实战项目——物流行业数据分析(二)

今天我们对物流行业数据进行简单分析&#xff0c;数据来源&#xff1a;某企业销售的6种商品所对应的送货及用户反馈数据 解决问题&#xff1a; 1、配送服务是否存在问题 2、是否存在尚有潜力的销售区域 3、商品是否存在质量问题 分析过程&#xff1a; 依旧先进行数据处理 一…

vue Duplicate keys detected: ‘‘. This may cause an update error. found in

错误原因&#xff1a; 在使用v-for的时候&#xff0c;都要必须加上一个唯一的key值&#xff0c;key的值写成一样的了。所以就导致了警告。尽量不要使用index下标作为key值 换成后台数据返回的id或者i*随机数作为key值就好

linux中快速定位软件安装位置

linux中快速定位软件安装位置步骤如下&#xff1a; 根据进程的名字定位进程ID ps -ef | grep redis通过进程id查找软件安装位置 ll -l /proc/100788/cwd原理说明&#xff1a; linux中进程启动后&#xff0c;会在/proc/目录下新建进程工作目录; 目录规范为&#xff1a;/proc/…

寻找下一个生成式 AI 独角兽,亚马逊云科技创业加速器火热招募中!

生成式AI让人工智能技术又一次破圈&#xff0c;带来了机器学习被大规模采用的历史转折点。它正在掀起新一轮的科技革命&#xff0c;为人类带来前所未有的颠覆性的影响&#xff0c;而诸多创业者也应势而上&#xff0c;寻求创新机遇。生成式AI可以创造全新的客户体验、提高企业内…

将数字孪生系统接入 CesiumJS,能为智慧城市项目带来怎样的改变?

数字孪生系统接入 CesiumJS 的契机&#xff0c;正是智慧城市项目的需要。因为许多智慧城市项目中包含了大量地形、倾斜摄影、DOM、DEM 等 GIS 数据&#xff0c;那么为了能够在数字孪生系统中导入这些 GIS 数据&#xff0c;同时让这些数据在以可视化形式表现出来后&#xff0c;还…

C++-17. 电话号码的字母组合

题目来源&#xff1a;力扣 题目描述&#xff1a; 给定一个仅包含数字 2-9 的字符串&#xff0c;返回所有它能表示的字母组合。答案可以按 任意顺序 返回。 给出数字到字母的映射如下&#xff08;与电话按键相同&#xff09;。注意 1 不对应任何字母。 示例 1&#xff1a; 输…

【MySQL】数据不存在则插入

系列文章 C#底层库–MySQLBuilder脚本构建类&#xff08;select、insert、update、in、带条件的SQL自动生成&#xff09; 本文链接&#xff1a;https://blog.csdn.net/youcheng_ge/article/details/129179216 C#底层库–MySQL数据库操作辅助类&#xff08;推荐阅读&#xff0…

全面认识二极管,一篇文章就够了

电子设计基础元器件 二极管&#xff0c;小小二极管&#xff0c;大大用途。 ... 矜辰所致目录 前言一、二极管基础知识1.1 什么是二极管1.2 二极管的组成1.3 二极管的原理 二、二极管特性2.1 伏安特性曲线图2.2 温度的影响2.3 关于击穿 三、 二极管的参数正向连续电流和平均整…

银行金融风险管理面试问题汇总(附答案)

最近有些学员在咨询换工作的事&#xff0c;包括一些金融上市公司的高管。我收集了一些金融风险管理面试问题相关资料&#xff0c;希望能帮助大家。记得收藏此文章&#xff0c;以防之后找不到文章。 风险经理识别和分析潜在的公司风险&#xff0c;并找到减少或避免风险的方法。…

pve (群辉、软路由、win/linux)折腾日记

目录 生命不息&#xff0c;折腾不止名词解释硬件参数装机PVE安装下载pveultraISO 把镜像写入u盘rufus把镜像写入U盘bios设置U盘启动安装pve系统 ssh连接pvepve的使用安装pvetools安装ubuntu-server系统ubuntu更换国内源ubuntu安装docker更改docker国内源docker环境下安装青龙 安…

了解 MySQL 的存储引擎

点击上方↑“追梦 Java”关注&#xff0c;一起追梦&#xff01; 存储引擎的主要工作就是与文件系统进行数据交互&#xff0c;比如我们常用的 InnoDB 引擎。 MySQL 的存储引擎是插件式的&#xff0c;应用程序无需针对不同的存储引擎进行对应的编码操作&#xff0c;MySQL 提供了一…

什么是布道师?看完这篇文章你就懂了

布道师这个术语可能对许多人来说还比较陌生&#xff0c;但实际上&#xff0c;布道师在软件行业中扮演着非常重要的角色。他们是软件产品的积极倡导者和用户之间的桥梁&#xff0c;致力于传递好消息、收集反馈&#xff0c;并与用户建立良好的关系。在本文中&#xff0c;我们将深…

Linux —— 查看进程命令及进程优先级

目录 一&#xff0c;查看进程命令 1&#xff0c;ps 命令 ps axj ps aux ps l ps -l 2&#xff0c;top 命令 3&#xff0c;ptree 命令 4&#xff0c;pgrep 命令 三&#xff0c;进程优先级 PRI NI 一&#xff0c;查看进程命令 ps、top、pstree、grep&#xff1b; 1&…

腾讯云 Finops Crane 开发者集训营 - 云成本优化一站式解决方案实践

一、 相关活动介绍&#xff1a; 自从上次参加完CSDN联合腾讯云发起的《云原生之降本增效》活动后&#xff0c;只是停留聚焦在优秀实践方法论、资源与弹性、架构设计上的了解&#xff0c;本次《腾讯云 Finops Crane 开发者集训营》是深入了解并实践基于 FinOps 框架开展的一个成…

001-Spring简要原理分析

Bean的生产 class到beanDefinition beanDefinition到Bean Bean查找流程 根据类型找找到多个根据名称找 AOP 在实例化后创建代理对象返回 把之前创建的Bean塞入代理对象的 target 字段中 事务 利用AOP代理掉数据源 在提交事务的时候 关闭自动提交手动提交事务异常回滚事…