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

题目示例:

解法:(排序 + 双指针)
算法思路:
本题与之前讲解的两数之和为 s 类似,是非常经典的面试题。
与两数之和稍微不同的是,题目中要求找到所有【不重复】的三元组。那我们可以利用在两数之和为 s 那里的双指针思想:
- 先排序
- 然后固定一个数 stub;
- 在这个数后面的区间内,使用【双指针算法】快速找到两个数之和等于 -stub 即可。
但是我们需要注意的是,这道题里面需要有【去重】操作!
找到一个结果之后,不要停,left++,right--缩小区间后,left 和 right 指针也要【跳过重复】的元素;
当使用完一次双指针算法之后,固定的 stub 也要【跳过重复】的元素。
C++代码演示:
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
// 解法一:使用去重容器 set(笔试可以直接秒题,但代码效率低)
// sort(nums.begin(), nums.end());
// vector<vector<int>> vv;
// set<vector<int>> s;
// int stub = nums.size() - 1;
// while(stub > 1 && nums[stub] >= 0) {
// int left = 0;
// int right = stub - 1;
// while(left < right) {
// if(nums[left] + nums[right] + nums[stub] > 0) {
(nums.(), nums.());
vector<vector<>> vv;
stub = nums.() - ;
(stub > && nums[stub] >= ) {
left = ;
right = stub - ;
(left < right) {
(nums[left] + nums[right] + nums[stub] > ) {
right--;
} (nums[left] + nums[right] + nums[stub] < ) {
left++;
} {
vv.({nums[left], nums[right], nums[stub]});
(left < right && nums[left] == nums[left + ]) {
left++;
}
(left < right && nums[right] == nums[right - ]) {
right--;
}
left++;
right--;
}
}
(stub > && nums[stub] == nums[stub - ]) {
stub--;
}
stub--;
}
vv;
}
};







