给你一个包含 `n` 个整数的数组 `nums`,判断 `nums` 中是否存在三个元素 `a` ,`b` ,`c` ,使得 `a + b + c = 0` ?请你找出所有满足条件且不重复的三元组。 **注意:** 答案中不可以包含重复的三元组。 **示例:** ```js 给定数组 nums = [-1, 0, 1, 2, -1, -4], 满足要求的三元组集合为: [ [-1, 0, 1], [-1, -1, 2] ] ``` 附赠leetcode地址:[leetcode](https://leetcode-cn.com/problems/3sum/solution/javascriptteng-xun-leetcode15san-shu-zhi-he-by-use/) 可结合 [字节&leetcode1:两数之和](https://github.com/sisterAn/JavaScript-Algorithms/issues/4) 一起查看
Activity
huangruitian commentedon Apr 30, 2020
thxiami commentedon Apr 30, 2020
@huangruitian
1.双指针寻找两数之和的方法挺巧妙的~ 可以用二分法进一步加快一下紧逼速度
2. K数之和的问题, 目前的思路也是类似将三数之和降为两数之和的办法.
假设数组有 n 个数, 求满足 K 个数之和为sum的所有组合.
a. 利用O(nlogn) 的时间排序
b. 一个循环将问题拆分为 n 个(K-1)数之和, 时间复杂度为 T(K) = O(n * T(K-1)) = O(n^(k-1))
huangruitian commentedon Apr 30, 2020
不错,对left 和 right的寻找速度用二分法确实是一个优化,很棒!K数之和的复杂度也补充得很棒。
sisterAn commentedon Apr 30, 2020
解法: 排序 + 双指针
我们可以继续按照两数之和的思路解题,遍历数组,选定一个数(
nums[i])作为三数之和的第一个数,然后题目就换成了在i+1到nums.length-1中两数之和问题。但会出现一个问题:结果中可能会出现重复的三元组
你可以尝试着去除重复元组,但花费的时间、空间复杂度就高了
感谢 @thxiami 的补充,我们可以使用排序去重:
这里介绍另一种思路解法:排序 + 双指针
为了防止结果数组中加入重复的元素,我们可以将
nums进行排序,例如第一个数nums[i] === nums[i-1]时,nums[i]作为第一个数与nums[i-1]作为第一个数得到的满足条件的三元组是一致的,所以此时nums[i]我们将不再进行判断,避免重复三元组,当然这只是第一个数,第二个数与第三个数的判断也是类似的。解题思路: 先数组排序,排序完后遍历数组,以
nums[i]作为第一个数first,以nums[i+1]作为第二个数second,将nums[nums.length - 1]作为第三个数last,判断三数之和是否为0,<0,则second往后移动一位(nums是增序排列),继续判断>0,则last往前移动一位(nums是增序排列),继续判断===0,则进入结果数组中,并且second往后移动一位,last往前移动一位,继续判断下一个元组直至
second >= last结束循环,此时,nums[i]作为第一个数的所有满足条件的元组都已写入结果数组中了,继续遍历数组,直至i === nums.length - 2(后面需要有second、last)代码实现:
leetcode
thxiami commentedon Apr 30, 2020
@sisterAn
使用 Map() 的第一种方法, 也是可以通过排序来去重的.
Been101 commentedon Jul 11, 2020
Ha0ran2001 commentedon May 28, 2022
你这个实现有问题
XW666 commentedon Jul 15, 2022
hanmaojiang commentedon Nov 29, 2022