这道题是一道双指针解决的例题,从字面上看,能想到的暴力解法就是三重循环,但是如果数据量过大的时候,时间复杂度会很高,所以我们要想办法减少循环次数,第二个循环和第三个循环都是在前一个循环的基础上对后面的数进行遍历,所以我们可以将第二个循环和第三个循环合并成一个循环,在我们确定第二个元素之后,我们只需要移动三个元素,来看三个数是否符合要求,这里我们设置一个变量target = -nums[i] (i为第一个元素的下标) 这样就变成了一个两数之和。
另外题目要求我们不能有重复的三元组,所以我们可以对所给数组进行排序+当前元素与前一个元素进行比较,这样就保证了不会有重复的三元组
cpp
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
int n = nums.size();
sort(nums.begin(),nums.end());
vector<vector<int>> vec;
for(int i = 0;i < n-2;i++){
int x = nums[i];
if (x + nums[i + 1] + nums[i + 2] > 0) break;
if (x + nums[n - 2] + nums[n - 1] < 0) continue;
if(i>0&&nums[i]==nums[i-1]){
continue;
}
int k = n-1,target = -nums[i];
for(int j = i + 1;j < n-1;j++){
if(j>i+1&&nums[j]==nums[j-1]){
continue;
}
while(j<k&&nums[j]+nums[k]>target){
k--;
}
if(j==k) break;
if(nums[j]+nums[k]==target){
vec.push_back({nums[i],nums[j],nums[k]});
}
}
}
return vec;
}
};