15. 三数之和
- 题号:15
- 来源:LeetCode
- 难度:中等
- 标签:
双指针排序数组 - 语言:TypeScript · Python
- 解法:2 个
- 作者:lmliheng
- 最近更新:2026-09-29
TypeScript
TypeScript · O(n^2) 时间 · O(n) 空间 · 更新于 2026-09-27
排序加双指针,最后对结果去重
typescript
/**
* @difficulty medium
* @tags 双指针,排序,数组
* @time O(n^2)
* @space O(n)
* @note 排序加双指针,最后对结果去重
* @15. 三数之和
*/
function threeSum(nums: number[]) {
nums = nums.sort((a, b) => a - b);
let res = [];
console.log(nums.toString());
if (nums.length == 3) {
if (nums[0] + nums[1] + nums[2] == 0) {
res.push([nums[0], nums[1], nums[2]]);
}
return res;
}
for (let i = 0; i < nums.length - 3; i++) {
// 重复的i不执行
// 排除无效循环
if (nums[i] + nums[i + 1] + nums[i + 2] > 0 && nums[i] + nums[nums.length - 1] + nums[nums.length - 2] < 0 || nums[i] == nums[i + i]) {
continue;
}
let head = i + 1;
let foot = nums.length - 1;
while (head < foot) {
let sum = nums[i] + nums[head] + nums[foot];
if (sum == 0) {
res.push([nums[i], nums[head], nums[foot]]);
head++;
foot--;
} else if (sum < 0) {
head++;
} else {
foot--;
}
}
}
// 去重
res = res.filter((item, index, arr) => arr.findIndex(t => t[0] === item[0] && t[1] === item[1] && t[2] === item[2]) === index);
return res;
};Python
Python · O(n^3) 时间 · O(1) 空间 · 更新于 2026-09-29
文件里是多重循环的暴力解法,会超时;正解是排序 + 双指针 O(n^2)
python
"""
@lc 15
@title 三数之和
@difficulty medium
@tags 双指针,数组,排序
@time O(n^3)
@space O(1)
@note 文件里是多重循环的暴力解法,会超时;正解是排序 + 双指针 O(n^2)
"""
class Solution:
def threeSum(self, nums: list[int]) -> list[list[int]]:
res=[]
seen = set()
n=len(nums)
if n<3:
return []
nums.sort()
if nums[0]+nums[1]+nums[2]>0 or nums[n-1]+nums[n-2]+nums[n-3]<0:
return []
for i in range(0,n-2):
for j in range(i+1,n-1):
target=0-nums[i]-nums[j]
print( nums[j:n-1])
if target in nums[j+1:n]:
# 唯一标识
triplet = tuple(sorted([nums[i], nums[j], target]))
if triplet not in seen:
seen.add(triplet)
res.append([nums[i],nums[j],target])
return res源码:python/leetcode/hot100/6.py
在 GitHub 上查看题目所在目录:lmliheng/algorithm