当前位置: 首页 > news >正文

获取三数之和

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

注意:答案中不可以包含重复的三元组(例如[a,b,c]与[c,b,a]为重复),如果无符合要求的三元组,则返回0。

提示:

  • 3 <= nums.length <= 3000

  • -10^5 <= nums[i] <= 10^5

  • 运行有时间、内存限制

输入格式:

一个整数数组,每个元素其间以“空格”分隔

输出格式:

所有符合题目要求三元组的数量,如果无符合要求的三元组,则返回0。

输入样例1:

在这里给出一组输入。例如:

-1 0 1 2 -1 -4

输出样例1:

在这里给出相应的输出。例如:

2
要解决这个问题,我们可以使用双指针法来寻找所有满足条件的三元组。具体步骤如下:1. 首先对数组进行排序,这样可以方便地使用双指针法。
2. 遍历数组,对于每个元素,使用双指针在剩余的部分寻找两个数,使得这三个数的和为零。
3. 为了避免重复的三元组,我们需要跳过重复的元素。以下是 Python 代码实现:```python
def three_sum(nums):nums.sort()  # 对数组进行排序n = len(nums)result = set()  # 使用集合来存储结果,避免重复for i in range(n):if i > 0 and nums[i] == nums[i - 1]:continue  # 跳过重复的元素left, right = i + 1, n - 1while left < right:total = nums[i] + nums[left] + nums[right]if total == 0:result.add((nums[i], nums[left], nums[right]))left += 1right -= 1# 跳过重复的元素while left < right and nums[left] == nums[left - 1]:left += 1while left < right and nums[right] == nums[right + 1]:right -= 1elif total < 0:left += 1else:right -= 1return len(result)# 读取输入
input_str = input().strip()
nums = list(map(int, input_str.split()))# 计算并输出结果
print(three_sum(nums))
```### 代码解释1. **排序**:首先对输入的数组进行排序,这样可以方便地使用双指针法。
2. **遍历数组**:使用一个 `for` 循环遍历数组中的每个元素,作为三元组中的第一个元素。
3. **双指针法**:对于每个元素,使用双指针在剩余的部分寻找两个数,使得这三个数的和为零。双指针分别从当前元素的下一个位置和数组的末尾开始,向中间移动。
4. **避免重复**:在遍历和移动指针的过程中,跳过重复的元素,以避免重复的三元组。
5. **结果存储**:使用集合来存储结果三元组,集合会自动去重。
6. **返回结果**:返回集合的大小,即不重复的三元组的数量。### 输入输出示例- 输入样例1: `-1 0 1 2 -1 -4`- 输出样例1: `2`
- 输入样例2: `0 1 1`- 输出样例2: `0`这个方法的时间复杂度为 \(O(n^2)\),空间复杂度为 \(O(n)\),在给定的输入限制下是可以接受的。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • SpringCloud之@FeignClient()注解的使用方式
  • 互联网摸鱼日报(2024-07-26)
  • 2种常用的取消word文档”打开密码“方法
  • 网络安全在2024好入行吗?
  • 前端系列-9 Vue3生命周期和computed和watch
  • 全国区块链职业技能大赛样题第9套后端源码
  • Hive环境搭建(Mysql数据库)
  • 【C语言】指针大小知多少 ?一场探寻C语言深处的冒险 !
  • Kubernetes 面试题及答案整理,最新面试题
  • Scrapy框架中,如何有效地管理和维护爬虫的日志记录?
  • 非线性校正算法在红外测温中的应用
  • Java-Swing开发-001组件
  • redis放在三层架构中的哪一层
  • Spark RPC框架详解
  • 计算机三级嵌入式(三)——嵌入式系统硬件组成
  • “寒冬”下的金三银四跳槽季来了,帮你客观分析一下局面
  • Centos6.8 使用rpm安装mysql5.7
  • CSS魔法堂:Absolute Positioning就这个样
  • Java,console输出实时的转向GUI textbox
  • JS学习笔记——闭包
  • Mithril.js 入门介绍
  • MySQL主从复制读写分离及奇怪的问题
  • niucms就是以城市为分割单位,在上面 小区/乡村/同城论坛+58+团购
  • php ci框架整合银盛支付
  • python3 使用 asyncio 代替线程
  • socket.io+express实现聊天室的思考(三)
  • storm drpc实例
  • vagrant 添加本地 box 安装 laravel homestead
  • 分享自己折腾多时的一套 vue 组件 --we-vue
  • 高程读书笔记 第六章 面向对象程序设计
  • 给第三方使用接口的 URL 签名实现
  • 关于 Linux 进程的 UID、EUID、GID 和 EGID
  • 关于Android中设置闹钟的相对比较完善的解决方案
  • 基于Javascript, Springboot的管理系统报表查询页面代码设计
  • 可能是历史上最全的CC0版权可以免费商用的图片网站
  • 手写一个CommonJS打包工具(一)
  • 突破自己的技术思维
  • 线上 python http server profile 实践
  • 硬币翻转问题,区间操作
  • ​​​【收录 Hello 算法】10.4 哈希优化策略
  • ​​快速排序(四)——挖坑法,前后指针法与非递归
  • ​iOS实时查看App运行日志
  • #70结构体案例1(导师,学生,成绩)
  • #Z2294. 打印树的直径
  • #快捷键# 大学四年我常用的软件快捷键大全,教你成为电脑高手!!
  • (02)vite环境变量配置
  • (06)Hive——正则表达式
  • (1)STL算法之遍历容器
  • (26)4.7 字符函数和字符串函数
  • (Demo分享)利用原生JavaScript-随机数-实现做一个烟花案例
  • (NO.00004)iOS实现打砖块游戏(九):游戏中小球与反弹棒的碰撞
  • (Note)C++中的继承方式
  • (Ruby)Ubuntu12.04安装Rails环境
  • (附源码)ssm码农论坛 毕业设计 231126
  • (附源码)基于ssm的模具配件账单管理系统 毕业设计 081848