这道题和上一题很相似,也是i从1到numsSize-2遍历,nums[i]作为中间的数,j k从0和numsSize-2向i靠拢,如果nums[i]+nums[j]+nums[k]-target>0,k--,如果nums[i]+nums[j]+nums[k]-target<0,j++,等于0的话直接返回target值。代码如下,竟然只用了4ms,还有谁???
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);
return 0;
}
int threeSumClosest(int* nums, int numsSize, int target) {
int i,j,k;
int currentDistance=2147483647;
int temp,temp1,temp2;
int res;
quickSort(nums,numsSize);
for(i=1;i<numsSize-1;i++)
{
j=0;
k=numsSize-1;
while(1)
{
temp1=nums[i]+nums[j]+nums[k];
temp=temp1-target;
temp2=abs(temp);
if(temp2<currentDistance)
{
currentDistance=temp2;
res=temp1;
}
if(temp<0)
{
j++;
if(j==i)
break;
}
else if(temp>0)
{
k--;
if(k==i)
break;
}
else
return res;
}
}
//printf(">%d %d %d\n",j,i,k);
return res;
}