这道题和前面的3 sum那道题很相似,也可以用相似的办法解决,排序后,先两层循环前面的两个数,后面的两个数从两边往中间逼近。
int quickSort(int *nums,int numSize)
{
int i,j,key,temp,flag;
key=nums[0];
i=0;
flag=0;
j=numSize-1;
if(numSize<=1)
return 0;
while(1)
{
while(1)
{
if(nums[j]<key)
{
temp=nums[i];
nums[i]=nums[j];
nums[j]=temp;
break;
}
j--;
if(i==j)
{
flag=1;
break;
}
}
if(flag==1)
break;
while(1)
{
if(nums[i]>key)
{
temp=nums[i];
nums[i]=nums[j];
nums[j]=temp;
break;
}
i++;
if(i==j)
{
flag=1;
break;
}
}
if(flag==1)
break;
}
quickSort(nums,i);
quickSort(nums+i+1,numSize-i-1);
/* for(i=0;i<numSize;i++)
printf("->%d ",nums[i]);
printf("\n");*/
return 0;
}
int** fourSum(int* nums, int numsSize, int target, int* returnSize)
{
int i,j,m,n,k,temp,flag;
int **res;
*returnSize=0;
quickSort(nums,numsSize);
res=(int **)malloc(sizeof(int *)*1000);
for(i=0;i<1000;i++) //......
res[i]=(int *)malloc(4*sizeof(int));
for(i=0;i<numsSize-3;i++)
for(j=i+1;j<numsSize-2;j++)
{
m=j+1;
n=numsSize-1;
while(1)
{
temp=nums[i]+nums[j]+nums[m]+nums[n];
if(temp>target)
{
n--;
if(n==m)
break;
}
else if(temp<target)
{
m++;
if(m==n)
break;
}
else
{
flag=0;
for(k=0;k<*returnSize;k++)
if(res[k][0]==nums[i]&&res[k][1]==nums[j]&&res[k][2]==nums[m]&&res[k][3]==nums[n])
{
flag=1;
break;
}
if(flag==0)
{
res[*returnSize][0]=nums[i];
res[*returnSize][1]=nums[j];
res[*returnSize][2]=nums[m];
res[*returnSize][3]=nums[n];
*returnSize=*returnSize+1;
}
n--;
if(n==m)
break;
m++;
if(n==m)
break;
}
}
}
return res;
}