007 三数之和
题目描述:

1.1 题目解析

1.2 思路 1:暴力
解法一:暴力求解(会超时)

时间复杂度:O(n^3),空间复杂度:O(logn)。
1.3 思路 2:排序 + 双指针
1.3.1 算法思路
本题与两数之和类似,是非常经典的面试题。与两数之和稍微不同的是,题目中要求找到所有【不重复】的三元组。那我们可以利用在两数之和那里用的双指针思想,来对我们的暴力枚举做优化:
1、先排序; 2、然后固定一个数 a; 3、在这个数后面的区间内,使用「双指针算法」快速找到两个数之和等于 -a 即可。
但是要注意的是,这道题里面需要有【去重】操作——
1、找到一个结果之后,left 和 right 指针要【跳过重复】的元素; 2、当使用完一次双指针算法之后,固定的 a 也要【跳过重复】的元素。
1.3.2 代码实现
代码演示:
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
vector<vector<int>> ret;
// 1、排序
sort(nums.begin(), nums.end());
// 2、固定
int n = nums.size();
for (int i = 0; i < n;) {
left = i + , right = n - , target = -nums[i];
(left < right) {
(nums[i] > ) ;
sum = nums[left] + nums[right];
(sum > target) right--;
(sum < target) left++;
{
ret.({nums[i], nums[left], nums[right]});
left++; right--;
(left < right && nums[left] == nums[left - ]) left++;
(left < right && nums[right] == nums[right + ]) right--;
}
}
i++;
(i < n && nums[i] == nums[i - ]) i++;
}
ret;
}
};








