任意多次交换两数组元素使得两数组之和的差值最小

思想:注意两数组长度不一定相同。现只能想到穷举法(时间复杂度大约为O(n^3)):记当前两数组之和的差值为abs(diff),其中diff=sum_A-sum_B,遍历所有组合(a[i], b[j]),察看abs(diff-2*(a[i]-b[j]))与abs(diff)的大小,若前者更小,则更新diff -= 2*(a[i]-b[j])并swap(a[i], b[j]);若找不到这样的组合,则当前状况为所求的最优解


代码:

int process(int a[], int b[], int n, int m){
	assert(a != NULL);
	assert(b != NULL);
	assert(n > 0);
	assert(m > 0);

	int diff = 0;
	for(int i = 0; i < n; i++) diff += a[i];
	for(int i = 0; i < m; i++) diff -= b[i];  //初始化diff
		

	for(int i = 0; i < n; i++){
		for(int j = 0; j < m; j++){
			if(abs(diff-2*(a[i]-b[j])) < abs(diff)){
				diff = diff-2*(a[i]-b[j]);  //注意先更新diff再交换a[i]和b[j]
				swap(&a[i], &b[j]);
				i = 0, j = 0;  //若diff被更新则从头开始遍历
			}
		}
	}
	return diff;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值