三数之和
题目链接:
题目描述:

题目示例:

解法:排序 + 双指针
暴力算法时间复杂度过高,不可行。采用排序加双指针优化。
算法思路:
本题与两数之和为 s 类似,是非常经典的面试题。
与两数之和稍微不同的是,题目中要求找到所有【不重复】的三元组。利用双指针思想对暴力枚举进行优化:
- 先排序
- 然后固定一个数 a;
- 在这个数后面的区间内,使用【双指针算法】快速找到两个数之和等于 -a 即可。
需要注意去重操作!
找到一个结果之后,不要停,left++,right--缩小区间后,left 和 right 指针也要【跳过重复】的元素;
当使用完一次双指针算法之后,固定的 a 也要【跳过重复】的元素。
C++ 代码演示:
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
vector<vector<int>> ret;
// 排序
sort(nums.begin(), nums.end());
int n = nums.size();
for (int i = 0; i < n;) {
// 固定数 a(nums[i])
int left = i + 1, right = n - 1;
int target = -nums[i];
(nums[i] > ) ;
(left < right) {
sum = nums[left] + nums[right];
(sum < target) left++;
(sum > target) right--;
{
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;
}
};







