Given an array nums of n integers, are three elements a, b, c in nums such that a+b+c=0? Find all unique triplets in the array which gives the sum of zero.
Note:
The solution set must not contain duplicate triplets.
Example:
> Given array nums = [-1, 0, 1, 2, -1, -4],
A solution set is:
[[-1, 0, 1],[-1, -1, 2]]
双指针法变种——三指针法(这里的指针指的是数组下标)
于是
Step1:将数组排序
Step2:以第一个数p1作为最外层循环,其中如果第一个数如果为正,说明和不可能为0
Step3:定义中间指针p2,尾指针p3,
vector<vector<int>> threeSum(vector<int>& nums) {
vector<vector<int> > resVec;
sort(nums.begin(),nums.end()); //将nums从小到大排序
for(int p1=0;p1<nums.size();p1++){
if(nums[p1] >0) //如果第一个数为正数,说明肯定不存在三个数
return resVec;
if(p1>0 && nums[p1] == nums[p1-1]) //由于结果需要唯一性,故去除nums中的重复元素
continue;
int p2 = p1+1;//中间指针
int p3 = nums.size()-1;//尾指针
while(p2<p3){
int a = nums[p1];//非正
int b = nums[p2];
int c = nums[p3];
if(b+c== -a){
vector<int> tempVec(3);
tempVec[0] = a;
tempVec[1] = b;
tempVec[2] = c;
resVec.push_back(tempVec);
while (p2 < p3 && nums[p2] == nums[p2 + 1]) //去除重复元素
p2++;
while (p2 < p3 && nums[p3 - 1] == nums[p3]) //去除重复元素
p3--;
p2++;
p3--;
}
else if(b+c < -a){ //如果b+c之和小于-a,说明和太小了,应该往数值大的方向的移动
p2++;
}
else{ //反之,如果b+c之和大于-a,说明和太大了,应该往数值小的方向的移动
p3--;
}
}
}
return resVec;
}
原文:https://www.cnblogs.com/Jessey-Ge/p/10993487.html