思路1:首先用了比较笨的方法,三层循环遍历所有可能,把得到的每种组合的三个数排序,再遍历当前已经得到的结果看有没有重复的,没有就加入结果集。结果Accepted,但是Runtime竟然达到了300多毫秒。我靠,真实够笨的。。。
思路2:首先用快速排序把nums[]排序,从而保证将来的结果有序。i从1到numsSize-2遍历,nums[i]作为所遍历项的中间那个数,j k分别从0和numsSize-1向i靠拢,如果nums[i]+nums[j]+nums[k]>0,就k--,如果nums[i]+nums[j]+nums[k]<0,就j++,直到j或者k与i相等。这样就可以避免很多遍历项。代码如下,64毫秒,差强人意吧
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** threeSum(int* nums, int numsSize, int* returnSize)
{
int i,j,k,m,temp;
int **res;
int flag;
j=0;
*returnSize=0;
k=numsSize-1;
quickSort(nums,numsSize);
res=(int **)malloc(sizeof(int *)*1000);
for(i=0;i<1000;i++)
res[i]=(int *)malloc(3*sizeof(int));
for(i=1;i<numsSize-1;i++)
{
j=0;
k=numsSize-1;
while(1)
{
temp=nums[i]+nums[j]+nums[k];
if(temp==0)
{
flag=0;
for(m=0;m<*returnSize;m++)
{
if(res[m][0]==nums[j]&&res[m][1]==nums[i]&&res[m][2]==nums[k])
{
flag=1;
break;
}
}
if(flag==0)
{
res[*returnSize][0]=nums[j];
res[*returnSize][1]=nums[i];
res[*returnSize][2]=nums[k];
*returnSize=*returnSize+1;
}
k--;
j++;
if(j==i||k==i)
break;
}
else if(temp>0)
{
k--;
if(k==i)
break;
}
else
{
j++;
if(j==i)
break;
}
}
}
return res;
}