Time: 20190920
Type: Medium

题目描述

给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组。

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

例如, 给定数组 nums = [-1, 0, 1, 2, -1, -4]

满足要求的三元组集合为:

[[-1, 0, 1],[-1, -1, 2]
]

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/3sum
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

思路

首先从大的方面来看,排序之后比较容易做到去重,相同元素直接选取代表即可。

拍完序之后,以下标i从左往右遍历作为主循环,找到剩下两个加起来和为-nums[i]的两个元素。

这样的两个元素一定出现在nums[i]后面,这个限制非常关键。因为主循环是从左往右遍历,如果不限制只在当前元素后面找,则会重复答案。

加上这个限制,如果当前元素大于0,则表示后面的所有元素都大于0,三个数相加之和不可能为0.

这里有两次去重的概念,首先是在外层,如果nums[i]和上一个元素nums[i-1]相同,则直接跳过,因为相同值已经考虑过了。

另一个是在三数之和为0时,还要其他的解,这里也考虑一次去重即可。

代码

class Solution:def threeSum(self, nums: List[int]) -> List[List[int]]:if len(nums) < 3 or nums == None:return None# 本题需要去重nums.sort() # 原地排序res = []# 三指针: nums[j] + nums[k] == -nums[i]for i in range(len(nums)):# 排序之后,nums[i]大于0则不可能从后面找到解if nums[i] > 0:breakif i > 0 and nums[i] == nums[i - 1]:continuej = i + 1k = len(nums) - 1while j < k:_sum = nums[i] + nums[j] + nums[k]if _sum == 0:temp = [nums[i], nums[j], nums[k]]res.append(temp)while j < k and nums[j] == nums[j + 1]:j += 1while j < k and nums[k] == nums[k-1]:k -= 1j += 1k -= 1elif _sum > 0:k -= 1elif _sum < 0:j += 1return res

2019.10 Update:

第一届PAT算法直播课培训班招募帖,欢迎点击查看详情、

END.

Leetcode 15.三数之和相关推荐

  1. [双指针|模拟] leetcode 15 三数之和

    [双指针|模拟] leetcode 15 三数之和 1.题目 题目链接 给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ? ...

  2. LeetCode 15. 三数之和(3Sum)

    15. 三数之和 15. 3Sum 题目描述 Given an array nums of n integers, are there elements a, b, c in nums such th ...

  3. Java实现 LeetCode 15 三数之和

    15. 三数之和 给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组. 注意:答案中不可以 ...

  4. LeetCode 15. 三数之和【双指针】

    15. 三数之和 给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i != j.i != k 且 j != k ,同时还满足 nums[ ...

  5. LeetCode 15. 三数之和

    题目描述 15. 三数之和 思路 思路1 比较容易想到的就是,求三数之和等于0,可以等价于求两个数的和,然后看这个和的相反数是否在nums里面. 但是 T_T这样的话复杂度太高了,会超时,捂脸,最后三 ...

  6. LeetCode 15三数之和16最接近的三数之和

    三数之和(双指针) 题意: 给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有满足条件且不重复的三元组. 注意 ...

  7. Leetcode 15:三数之和(最详细解决方案!!!)

    给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 *a,b,c ,*使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组. **注意:**答案中不可以包含重 ...

  8. 2021-5-11 Leetcode 15.三数之和

    1.1我的解法以及考虑到的几点问题 1)数组长度小于3的不用考虑,直接返回 2)暴力法:每一次查找不是自己选择的数字,看一下能否凑成零(但是这样不知道如何去重) 3)拆成一个数字+LC 1.两数之和的 ...

  9. Leetcode 15.三数之和 双指针 or 暴力哈希

    题目链接:传送门 题目:给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有和为 0 且不重复的三元组. 暴力+ ...

最新文章

  1. MediaSource 缓存
  2. 博客基础_django_python从入门到实践_创建项目_创建应用
  3. Xcode6中添加pch文件
  4. MyBufferedReader
  5. html div阴影向上,css3阴影向上缓动样式
  6. 宋浩 概率统计 笔记_推论统计分析学习笔记
  7. 蓝色中国风传统图案背景素材
  8. Vue的使用技巧是什么,学习难度怎么样?
  9. Kotlin入门(15)独门秘笈之特殊类
  10. 索引sql server_SQL Server索引结构和概念
  11. SpringBoot + Vue 开发前后端分离的旅游管理系统
  12. 配置svn支持http协议访问
  13. EasyUi – 5.修改$.messager.show() 弹出窗口在浏览器顶部中间出现
  14. PHP json_decode($json, TRUE) TRUE使数据格式化为Array,而非object
  15. android之去掉actionbar
  16. linux pstack命令总结
  17. Scikit-learn:scikit-learn快速教程及实例
  18. 【php】 布尔值判断
  19. Linux多线程编程实验
  20. Java 实现数据库导出Excle

热门文章

  1. python---之np.prod() 函数计算数组元素乘积等
  2. 1.6 logistic回归的keras实现
  3. (九)OpenCV Canny边缘检测
  4. 数据结构笔记(二十六)-- 图的存储
  5. xshell停止运行脚本_Xshell无法启动:要继续使用此程序,您必须应用最新的更新或使用新版本...
  6. 统计信号处理基础_0基础学Python,就业中你需要建立360度无死角技能树
  7. pyqt 槽任意参数_根据效果及设计参数选择合适的洗墙灯
  8. grafana默认用户名密码_Grafana安装与配置
  9. linux 777权限_认识Linux之Linux命令-用户、权限管理(8)
  10. 仅需6道题轻松掌握SciPy空间计算基础 | Python技能树征题