这道题是一道经典的2pointer题目,是之前的2Sum的升级版本,题目要求是在有n个元素的数组中找出所有和为0的3个元素,并输出。解题思路主要为:首先对数组排序,然后遍历每个元素,对每个元素来说只需要找到其他两个和为其相反数的元素,为了防止查找重复,每次都在该元素的后面查找其他两个元素。这样代码的时间复杂度为,不会超时
代码如下(使用C++编写):
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
sort(nums.begin(),nums.end());
vector<vector<int>> result;
int lf=0,num2=0,num3=0;
for (int i=0;i<nums.size();)
{
vector <int> rst;
lf=0-nums[i];
int j=i+1,k=nums.size()-1;
while (j<k)
{
if (nums[j]+nums[k]<lf) j++;
else if (nums[j]+nums[k]>lf) k--;
else
{
rst.push_back(nums[i]);
rst.push_back(nums[j]);
rst.push_back(nums[k]);
result.push_back(rst);
rst.clear();
j++;
// 如果前后元素为同一个数,则跳过
while (nums[j]==nums[j-1]) j++;
}
}
i++;
while (nums[i]==nums[i-1]) i++;
}
return result;
}
};