快速找到和为零的四个数(20)

1 问题描述

给定四个数组,A,B,C,D,从每个数组找出取出一个元素,使得a+b+c+d=0。问满足条件的一共有多少组。

输入样例 第一行//每组元素的个数 剩下n行 //每组数组的元素

6    

-45   22   42   -16    

-41  -27  56   30 

-36   53  -37   77 

-36   30  -75  -46 

 26  -38  -10   62  

-32  -54   -6   45 

输出

6

2 分析

如果只有两组数,当取出一个数组的数值为a,则另一组数中只要有-a即可,因此变成一个查找问题。

同样的,将前两个数的数组之和(每个数组提一个元素)记为sum1,后两个数组之和(每个数组提一个元素)记为sum2,当sum2 = -sum1时,则满足条件。若有重复元素,则沿着数组计数求出元素的个数即可。

3 代码

int binsearch(const int t, const int len, int* sum1, int* sum2) {
	//len为sum1和sum2的数组长度
	int num = 0;
	int left = 0, right = len - 1;
	while (left < right) {
		int mid = left + (right - left) / 2;
		if (t <= sum2[mid])
			right = mid;
		else
			left = mid + 1;
	}//找到了

	while (sum2[left] == t && left < len) {
		num++;
		left++;
	}
	return num;
}

void test() {
	int N;    //每个数组的元素个数
	cin >> N;
	int* arr = new int[N];
	int* brr = new int[N];
	int* crr = new int[N];
	int* drr = new int[N];
	int i = 0;
	while (i < N) {
		cin >> arr[i] >> brr[i] >> crr[i] >> drr[i];
		i++;
	}

	int* sum1 = new int[N*N];
	int* sum2 = new int[N*N];
	int t = 0;
	for (i = 0; i < N; i++) {
		for (int j = 0; j < N; j++) {
			sum1[t] = arr[i] + brr[j];
			sum2[t] = crr[i] + drr[j];
			t++;
		}
	}

	//将sum1和sum2进行排序
	sort(sum1, sum1 + t);
	sort(sum2, sum2 + t);

	int num = 0;
	for (i = t - 1; i >= 0; i--)
		num += binsearch(-sum1[i], N*N, sum1, sum2);

	cout << num << endl;
}

int main() {
	test();
	system("pause");
	return 0;
}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值