与三数之和的思路类似,没看过三数之和的朋友可以先看看三数之和/C++
唯一变的就是在i外面加了一层for循环k,然后剪枝操作稍微变了一下,因为三数相加只需要目标值大于0即可,所以num[i]>0即可剪枝,但是target的值不一定都是整数,也可能是负数,所以按照三数之和的思路num[k]>target即可剪枝的思想是错误的,例如 -2 -1 -1 1,target=-3,虽然-2>-3,但是这里是不可以剪枝的,-2 -1 -1 1也是满足要求的元组。其他的思路和三数之和的思路就是一模一样的了。
代码:
//四数之和,a+b+c+d=target,不包含重复元组
#include<iostream>
#include<algorithm>
using namespace std;
#define LEN 6
int main()
{
int target = 0;
int num[] = {1,0,-1,0,-2,2};
sort(num,num+LEN);
for(int k=0;k<LEN;k++)
{
if(num[k]>target && num[k]>=0) break; //剪枝操作
if(k>0 && num[k] == num[k-1]) continue; //去重操作
for(int i=k+1;i<LEN;i++)
{
if(num[k]+num[i]>target && num[k]+num[i]>=0) break; //剪枝操作
if(i>k+1 && num[i]==num[i-1]) continue; //去重操作
int left = i+1;
int right = LEN-1;
while(left<right)
{
if(num[k]+num[i]+num[left]+num[right]<target) left++;
else if(num[k]+num[i]+num[left]+num[right]>target) right--;
else
{
cout<<num[k]<<" "<<num[i]<<" "<<num[left]<<" "<<num[right]<<endl;
while(left<right && num[left] == num[left+1]) left++; //去重操作
while(left<right && num[right] == num[right-1]) right--; //去重操作
left++;
right--;
}
}
}
}
return 0;
}