15. 三数之和
15. 三数之和
题目
15. 三数之和(中等)
给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i != j、i != k 且 j != k ,同时还满足 nums[i] + nums[j] + nums[k] == 0 。请你返回所有和为 0 且不重复的三元组。
注意:答案中不可以包含重复的三元组。
示例:
输入:nums = [-1,0,1,2,-1,-4]
输出:[[-1,-1,2],[-1,0,1]]
输入:nums = [0,1,1]
输出:[]
输入:nums = [0,0,0]
输出:[[0,0,0]]数据范围:3 ≤ nums.length ≤ 3000,-10^5 ≤ nums[i] ≤ 10^5
思路
排序 + 双指针:
- 先将数组排序
- 固定第一个数
nums[i],在i + 1到n - 1的区间内使用双指针寻找另外两个数 - 双指针目标:
nums[left] + nums[right] == -nums[i] - 通过跳过重复元素,避免产生重复三元组
- 如果
nums[i] > 0,由于数组已排序,后面元素都大于0,三数之和不可能为0,可以直接结束
代码
from typing import List
class Solution:
def threeSum(self, nums: List[int]) -> List[List[int]]:
nums.sort()
n = len(nums)
ans = []
for i in range(n - 2):
if nums[i] > 0:
break
if i > 0 and nums[i] == nums[i - 1]:
continue
left, right = i + 1, n - 1
target = -nums[i]
while left < right:
cur = nums[left] + nums[right]
if cur == target:
ans.append([nums[i], nums[left], nums[right]])
while left < right and nums[left] == nums[left + 1]:
left += 1
while left < right and nums[right] == nums[right - 1]:
right -= 1
left += 1
right -= 1
elif cur < target:
left += 1
else:
right -= 1
return ans复杂度分析
| 项目 | 复杂度 |
|---|---|
| 时间复杂度 | O(n^2) |
| 空间复杂度 | O(1),不计返回结果和排序递归栈 |
15. 三数之和
https://mingsm17518.github.io/2026/10/02/刷题笔记/Hot100/双指针/15. 三数之和/