Given an array nums
of n integers and an integer target
, are there elements a, b, c, and d in nums
such that a + b + c + d = target
? Find all unique quadruplets in the array which gives the sum of target
.
Note:
The solution set must not contain duplicate quadruplets.
Example:
Given array nums = [1, 0, -1, 0, -2, 2], and target = 0. A solution set is: [ [-1, 0, 0, 1], [-2, -1, 1, 2], [-2, 0, 0, 2] ]
/**
* Return an array of arrays of size *returnSize.
* Note: The returned array must be malloced, assume caller calls free().
*/
void sort(int *nums,int numsSize)
{
int i,j,k,tem;
for(i=0;i<numsSize-1;i++)
{
k=i;
for(j=i+1;j<numsSize;j++)
if(nums[j]<nums[k])
k=j;
if(i!=k)
{
tem=nums[i];
nums[i]=nums[k];
nums[k]=tem;
}
}
}
int** fourSum(int* nums, int numsSize, int target, int* returnSize) {
if(numsSize<=3)
return NULL;
int **res=(int **)malloc(sizeof(int *)*10000);
*returnSize=0;
sort(nums,numsSize);
int i,j,k,l,tem;
for(i=0;i<numsSize-3;i++)
{
if(i!=0&&nums[i]==nums[i-1])
continue;
for(j=i+1;j<numsSize-2;j++)
{
if(j!=i+1&&nums[j]==nums[j-1])
continue;
for(k=j+1;k<numsSize-1;k++)
{
if(k!=j+1&&nums[k]==nums[k-1])
continue;
for(l=k+1;l<numsSize;l++)
{
if(l!=k+1&&nums[l]==nums[l-1])
continue;
if(target==nums[i]+nums[j]+nums[k]+nums[l])
{
(*returnSize)++;
res[*returnSize-1]=(int *)malloc(sizeof(int)*4);
res[*returnSize-1][0]=nums[i];
res[*returnSize-1][1]=nums[j];
res[*returnSize-1][2]=nums[k];
res[*returnSize-1][3]=nums[l];
}
}
}
}
}
return res;
}