15. 三数之和
算法
- 排序数组:
- 首先将数组从小到大排序,方便后续操作
- 固定一个数,双指针搜索:
- 遍历排序后的数组,用
i指向当前固定的数 - 在
i的右侧,使用双指针j和k:j指向i + 1k指向数组末尾
- 检查三数之和:
- 若三数之和小于
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 代码
|
|