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

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

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

满足要求的三元组集合为:
[
[-1, 0, 1],
[-1, -1, 2]
]
思路:
首先对数组进行排序,排序后固定一个数 nums[i],再使用左右指针指向 nums[i]后面的两端,数字分别为 nums[L]和 nums[R],计算三个数的和 sum 判断是否满足为 0,满足则添加进结果集
如果 nums[i]大于 0,则三数之和必然无法等于 0,结束循环
如果 nums[i] == nums[i−1],则说明该数字重复,会导致结果重复,所以应该跳过
当 sum == 0 时,nums[L] == nums[L+1] 则会导致结果重复,应该跳过,L++
当 sum == 0 时,nums[R] == nums[R−1] 则会导致结果重复,应该跳过,R−−
时间复杂度:O(n2)),n为数组长度
 
代码如下:
class Solution(object):
def threeSum(self, nums):
"""
:type nums: List[int]
:rtype: List[List[int]]
"""
nums.sort()
L, res = len(nums), []
for i in range(L-2):
if i > 0 and nums[i] == nums[i-1]:
continue
target = -1 * nums[i]
j,k = i + 1, L - 1
while j<k:
if nums[j]+nums[k] == target:
res.append([nums[i], nums[j], nums[k]])
j = j + 1
while j<k and nums[j] == nums[j-1]:
j = j + 1
elif nums[j] + nums[k] < target:
j = j + 1
else:
k = k - 1
return res

最新文章

  1. 使用git 更新线上代码
  2. 【异常处理_iis】无法启动IIS Express\iisexpress.exe
  3. poj 2187 Beauty Contest(凸包求解多节点的之间的最大距离)
  4. Delegate(委托与事件)
  5. Spring中的Jdbc事务管理
  6. vc不用IDE编译方法
  7. java中单例类
  8. Spring读取配置文件的几种方式
  9. 【JS】JS外联不执行,内联执行
  10. Activity之间通过intent 传递Map
  11. sar
  12. codeforces 569A Music
  13. 【Android】android图片轮播
  14. ios NSComparator 三种枚举类型
  15. webstorm配置编译sass的输出目录
  16. MongoDB基础教程系列--第九篇 MongoDB 分片
  17. Springmvc_validation 效验器
  18. VSTO中Word转换Range为Image的方法
  19. 牛客网数据库SQL实战(11-15)
  20. 关于 ASP.NET 中的 Bundle 的补充说明(草稿)

热门文章

  1. android-------开发常用框架汇总
  2. vue给元素动态添加class
  3. vue项目中引入第三方框架
  4. python-flask-SQLAlchemy-Utils组件
  5. 安卓——AlertDialog多样按钮
  6. TSFDEVTY
  7. Git中ssh的使用
  8. 【LeetCode】矩阵操作
  9. Hadoop---集群的搭建(仅主机模式)
  10. img 标签