数组中找到3个数字总和为0的所有组合
方法:
先排序
排完序后先确定一个数字,位置为i
接着left=i+1,right=n-1
然后就是常见的左右指针确定法,小了的话left++,大了的话right--
不过要记得除重复
用while循环方式
right_num=nums[right];
while(nums[--right]==right_num)
vector< vector<int> > threeSum(vector<int>& nums)
{
int i,j,left,right,n,left_num,right_num,sum;
vector< vector<int> > ans;
vector<int> vec;
sort(nums.begin(),nums.end());
//for(i=0;i<nums.size();i++)
// // printf("%d ",nums[i]);
//cout<<endl;
n=nums.size();
for(i=0;i<n;)
{
left=i+1;right=n-1;
while(left<right)
{
sum=nums[i]+nums[left]+nums[right];
if(sum==0)
{
//cout<<"!"<<endl;
printf("i=%d,l=%d,r=%d\n",i,left,right);
vec.resize(0);
vec.push_back(nums[i]);
vec.push_back(nums[left]);
vec.push_back(nums[right]);
ans.push_back(vec);
right_num=nums[right];
while(nums[--right]==right_num)
;
left_num=nums[left];
while(nums[++left]==left_num)
;
}
else if(sum>0)
{
right_num=nums[right];
while(nums[--right]==right_num)
;
}
else
{
left_num=nums[left];
while(nums[++left]==left_num)
;
}
}
left_num=nums[i];
while(i<n&&nums[++i]==left_num)
;
}
return ans;
}