15. 三数之和
算法
- 排序数组:
- 首先将数组从小到大排序,方便后续操作
- 固定一个数,双指针搜索:
- 遍历排序后的数组,用
i
指向当前固定的数 - 在
i
的右侧,使用双指针j
和k
:j
指向i + 1
k
指向数组末尾
- 检查三数之和:
- 若三数之和小于
0
,说明需要更大的值,移动j
向右 - 若三数之和大于
0
,说明需要更小的值,移动k
向左 - 若三数之和等于
0
,记录结果,同时移动j
和k
跳过重复值
- 若三数之和小于
- 遍历排序后的数组,用
- 去重:
- 对于固定数
nums[i]
,若nums[i] = nums[i-1]
,跳过当前遍历,避免重复三元组 - 对于
nums[j]
和nums[k]
,在找到一个解后,继续移动跳过相同值
- 对于固定数
复杂度分析
时间复杂度
- 排序复杂度:
O(nlogn)
- 三重循环复杂度:外层循环
O(n)
,内层双指针O(n)
,总复杂度为O(n^2)
- 总时间复杂度
O(n^2)
空间复杂度
- 使用排序
O(logn)
的额外空间,其余操作在原地完成,空间复杂度为O(1)
C++ 代码
|
|
Python 代码
|
|
Go 代码
|
|
JavaScript 代码
|
|