原题

题目大意

给定一个包含 n 个整数的数组,问是否存在属于数组的三个元素 a、b、c,使得 a+b+c = 0,并返回所有的 [a,b,c] 取值情况(要剔除重复的取值情况)

解题思路

第一反应是进行遍历,穷举出数组中三个元素的所有组合情况,再筛选出符合条件的,但这个要三重循环,时间复杂度太高,放弃。

我的思路是将其转化为 n-2 个 2sum 问题来实现;具体思路如下:假设 数组为 [A1,A2,A3,A4,……An],首先对数组从 A1 到 An-2 进行遍历,取值为Ai,再从剩下的 n-i 个元素中找到两个元素 M、N,使其满足 M+N = -Ai,这样就相当于找到了,三个元素满足 Ai + M + N = 0

至于 2sum 的问题,我们可以先将数组排序,然后分设两个指针,从两端向中间逼近,具体实现看代码。

这个方法有个比较绕的地方(咱也捋了好一会,才捋明白)就是为什么是从 n-i 个元素中找 M、N,而不是从 n-1个元素中。咱举个栗子,假设 Ai 取值为 A4 的时候,按照之前的说法,就应该是从 A5 到 An 中查找剩下的 M、N。有些人可能会说,还漏了 A1 到 A3 啊,其实不然,如果 M 或 N 取 A1 到 A3 中的某个值的话就会和之前的情况重叠。比如说 M 取值为 A2 ,N 去任意值,那么这个时候三个元素的取值分别是 [Ai = A4,M = A2,N = N] 这个和[Ai = A2,M = A4,N = N] 的情况重复了,不需要考虑。

还有一个比较麻烦的问题就是去重,我的解决方法是,每次处理完一种情况后,如果发现接下来的这个数和上一个数是相同的(数组已经排序了),则跳过这个相同的数值,因为多个相同的数值分别和任意两个数,组合出来的三元组都是一样的,所以只考虑一次即可。

代码实现

class Solution:def threeSum(self, nums):""":type nums: List[int]:rtype: List[List[int]]"""res = []lent = nums.__len__()nums.sort() # 对数组进行排序i = 0while i < lent-2: # 这个临界值要考虑清楚,因为是三个元素,第一个元素只需要取到倒数第三个数就成left = i + 1 # 从左边找小的right = lent-1 # 从右边找大的while left<right:if nums[left]+nums[right] == -nums[i]:res.append([nums[i],nums[left],nums[right]])# 相同的元素和任意两个元素的组合情况都是一样的,考虑一个即可while left < lent-1 and nums[left] == nums[left+1]:left = left + 1while right > 0 and nums[right] == nums[right-1]:right = right -1left = left + 1right = right -1# 三个元素之和大于 0 ,将 right 往左移一位,取小一点的    elif nums[left]+nums[right] > -nums[i]:right = right -1# 三个元素之和小于 0 ,将 left 往右移一位,取大一点的else:left = left + 1# 和上面的一样,相同元素只考虑一个即可while i < lent-2 and nums[i] == nums[i+1]:i = i + 1i = i + 1return res

和这道类似的题目还有最接近的三数之和 和 四数相加 ,方法都差不多,理解了的朋友可以用这两道,练练手。

[leetcode 3sum】 三数之和问题 @python相关推荐

  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. 【leetcode】最接近的三数之和,python实现

    算法思路:跟上提的三数之和为0的题目解题思路一样,但是不同的地方在于它多包含了一个target,所以在计算的时候直接把target减掉,就是计算三数之和和0的距离了,所以是绝对值. 那在这里的迭代算法 ...

  4. Leetcode 15.三数之和

    Time: 20190920 Type: Medium 题目描述 给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所 ...

  5. Java实现 LeetCode 15 三数之和

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

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

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

  7. 20200126:(leetcode)三数之和 最接近的三数之和(含图解)

    三数之和 && 最接近的三数之和 题目 基本思路 代码实现 题目 三数之和 给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b ...

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

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

  9. 用 PHP 来刷leetCode 之 三数之和

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

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

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

最新文章

  1. 简述Field,Attribute,Property的区别
  2. JS-鼠标跟随块(一个小圆点跟着鼠标跑)
  3. android 摇一摇监听,Android摇一摇功能实现(摇一摇监听)
  4. C++ 向函数传数组的方法
  5. 003thinkphp 数据库查询及表关联
  6. go语言的iota是什么意思_go语言基础之iota枚举
  7. Websphere7上发布web程序
  8. python处理pdf的第三方库_Python使用到第三方库PyMuPDF图片与pdf相互转换
  9. java调用tuxedo中间件_初探TUXEDO中间件
  10. 《剑指offer》之知识汇总
  11. css视差滑动(阅读网站案例)
  12. NLP系列(8)_用可视化解构BERT,从上亿参数中提取出的6种直观模式
  13. 2021年中考计算机考试,2021年初中信息技术考试操作题
  14. mysql binlog events_使用SHOW binlog events查看binlog内容
  15. 快速增加闲鱼浏览量,就靠这些方法
  16. String常用方法!
  17. TCP/IP层次安全性
  18. [Linux] ubuntu安装输入法----小企鹅输入法(Ubuntu上最好用的输入法)
  19. 败光370亿后,聚美优品踏上新的不归路?
  20. 外贸车辆汽配行业管理痛点解决方案丨汇信

热门文章

  1. Java Reflection
  2. 智能名片小程序开发文档概要
  3. maven 详情查考 maven实战 许晓斌
  4. 自定义AutoTextView实现公告栏 文字3D 翻转动画
  5. 知识图谱入门 (二) 知识表示与知识建模
  6. ORA-12154: TNS: 无法解析指定的连接标识符
  7. InfluxDB中Line Protocol理解
  8. 【牛客网】马三来刷题之回文解码(今日头条2017年客户端实习在线笔试题)
  9. 自学Java随时放弃(十二 控制跳转语句 ①break+②continue+③return)
  10. 【声明】本人博客已经迁移到博客园,欢迎访问!