库你急哇,哈集美马戏特~~
看完题目,哦,三层循环,简单粗暴
提交之后,emm,不愧是我
本题采用和上题一样的思路,双指针,并使用排除重复优化,如果上一题做出来,这题就没什么问题了。这次在优化过程中,采用了更像是人看的代码优化方式,比上一题看起来好多了
题目:
力扣官方题库
上代码(经过线上OJ测试)
#include <stdio.h>
#include <stdlib.h>
int compareByIncrease(const void *a,const void *b)
{
return *(int*)a-*(int*)b;
}
int threeSumClosest(int* nums, int numsSize, int target){
qsort(nums,numsSize,sizeof(int),compareByIncrease);
int min=100000;
int cur=0;
int sum=0;
int low=cur+1,high=numsSize-1;
for(cur=0;cur<numsSize-1;cur++)
{
if(cur>0&&nums[cur]==nums[cur-1])
{
continue;
}
low=cur+1;
high=numsSize-1;
while(low<high)
{
sum=nums[cur]+nums[low]+nums[high];
if(sum==target)
{
return target;
}
if(abs(sum-target)<abs(min-target))
{
min=sum;
}
if(sum>target)
{
--high;
for(;low<high;--high)
{
if(nums[high]!=nums[high+1])
{
break;
}
}
}
if(sum<target)
{
++low;
for(;low<high;++low)
{
if(nums[low]!=nums[low-1])
{
break;
}
}
}
}
}
return min;
}
int main()
{
int nums[]={-1,2,1,-4};
int numsSize=4;
int target=1;
printf("%d",threeSumClosest(nums,numsSize,target));
return 0;
}