C语言:三数和

最接近三数和也是用这种算法 多设置几个变量记录最接近的坐标和值即可 会用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++;
}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值