首先遍历数组,在遍历的过程中,当遍历的当前元素时,用双指针分别从当前元素的下一个元素和数组末尾元素开始扫描,计算三者和,若是满足和为0,则将双指针指向的元素push,然后双指针都继续扫描是否还存在不同的解,这时要注意判断扫描的元素是否和上一个元素相同,若相同,则忽略该元素,继续扫描(为的是防止有重复解)。若是不满足为0,则将和与0比较大小,若是比0 小,则移动左指针,若是比0大,则移动右指针,然后重复上述流程,直到遍历完所有数组值,就得到最后的解。
如果题目换成指定的相加和的值target,则方法不变,将0换为target即可。
代码如下:
class Solution {
public:
vector<vector<int> > threeSum(vector<int> &num) {
vector<vector<int>>res;
if(num.size()<3) return res;
sort(num.begin(),num.end());
for(int i=0;i<num.size()-2;i++)
{
if(num[i]>0) return res;
if(i>0&&num[i-1]==num[i]) continue;
int lf=i+1;
int rg=num.size()-1;
while(lf<rg)
{
int sum=num[i]+num[lf]+num[rg];
vector<int>vec;
if(sum==0)
{
vec.push_back(num[i]);
vec.push_back(num[lf]);
vec.push_back(num[rg]);
res.push_back(vec);
while(lf<rg&&num[lf]==num[lf+1])
lf++;
while(lf<rg&&num[rg]==num[rg-1])
rg--;
rg--;
lf++;
}
else if(sum>0) rg--;
else if(sum<0) lf++;
}
}
return res;
}
};
版权声明:本文为ldm_666原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。