#define MAXLEN 50
int cmp(const void* a, const void* b){
return *(int*)a - *(int*)b;
}
int** fourSum(int* nums, int numsSize, int target, int* returnSize, int** returnColumnSizes){
int first=0, secend, left, right, temp;
*returnSize=0;
*returnColumnSizes=(int*)calloc(MAXLEN,sizeof(int));
int** arr=(int**)calloc(MAXLEN,sizeof(int*));
qsort(nums, numsSize, sizeof(int), cmp);
while(first<numsSize-3 ){
secend=first+1;
while (secend < numsSize - 2 ){
left = secend + 1; right = numsSize - 1;
while (left < right){
temp = nums[first] + nums[secend] + nums[left] + nums[right];
if (temp == target){
arr[(*returnSize)]=(int*)calloc(4,sizeof(int));
arr[(*returnSize)][0]=nums[first];
arr[(*returnSize)][1]=nums[secend];
arr[(*returnSize)][2]=nums[left];
arr[(*returnSize)][3]=nums[right];
(*returnColumnSizes)[(*returnSize)++]=4;
while (nums[left] == nums[++left] && left < right);
while (nums[right] == nums[--right] && left < right);
}
else if (temp < target){
while (nums[left] == nums[++left] && left < right);
}
else{
while (nums[right] == nums[--right] && left < right);
}
}
while (nums[secend] == nums[++secend] && secend < numsSize - 2);
}
while (nums[first] == nums[++first] && first < numsSize - 3);
}
return arr;
}