最接近三数和也是用这种算法 多设置几个变量记录最接近的坐标和值即可 会用C语言求最大值就会这道题
给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组。
注意:答案中不可以包含重复的三元组。
例如, 给定数组 nums = [-1, 0, 1, 2, -1, -4],
满足要求的三元组集合为:
[
[-1, 0, 1],
[-1, -1, 2]
]
本题网上有很多思路,我采用一次快排+对撞指针的方式 算法本身很好理解 但是做的过程槽点太多了
1.快速排序 每次都告诉自己不要按照记忆编程,但是控制不了,快速排序完全笼罩在low<high的阴影下 第一句就应该来一个判断 然后 最最重要的 while(a[h]>temp&&l<h)后面的这个判断一定想着加上去 !!!!!!!!!!!!!!!!!!!!!!!!!!
2.这个是一次扫描 所以判定不重复的很好写 但是一开始写错了 想着每次输出的第一个元素不同
所以出问题了 比如 -1 0 1 -1 1 2要注意
#include<stdio.h>
void fast(int *a,int low,int high){
int l=low;
int h=high;
int temp=a[l];
if(l>h)
return;
while(l<h){
while(a[h]>temp&&l<h)
h–;
if(l<h){
a[l]=a[h];
l++;
}
while(a[l]<=temp&&l<h)
l++;
if(l<h){
a[h]=a[l];
h–;
}
}
a[l]=temp;
fast(a,low,l-1);
fast(a,l+1,high);
}
void main(){
int a[6]={-1,0,1,2,-1,-4};
int al=6;
fast(a,0,al-1);
int s=0;
for(s;s<6;s++)
printf("%d",a[s]);
printf("\n");
int i=0;
int target=0;
int i1=-9999;
int i2=-9999;
while(i<al-3&&a[i]<=0){
int j=i+1;
int z=al-1;
int num=target-a[i];
while(j<z){
int flag=a[j]+a[z];
if(flag>num)
z--;
else if(flag==num){
if(i1!=a[i]||i2!=a[j]){
printf("%d %d %d\n",a[i],a[j],a[z]);
i1=a[i];
i2=a[j];
j=z;
}
else{
j=z;
}
}
else
j++;
}
i++;
}
}