王道408数据结构2.2.3综合应用题14题解

文章介绍了如何通过枚举和二分查找算法解决三元组问题,其中最大数和最小数的差值是关键。查询函数query利用递归调用实现了对三个数组的遍历,并在每一步更新答案。最后,zhao函数通过调用query三次获取最小差值。时间复杂度为O(nlogn),空间复杂度为O(1)。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1)

三元组(a, b, c),我们假设其中最大数为maxv, 最小数为minv,中间数为midv,其距离为D = maxv - minv + maxv - midv + midv - minv = 2 * (maxv - minv),也就是说,只考虑三元组中的最大数和最小数即可。

那么,我们枚举S1中的每个元素xi,并利用二分查找,查找S2、S3中>=xi的最小的数,得到一个以S1元素为三元组中最小数的子答案。

同样地,枚举S2、S3,得到另外两个子答案,三个子答案中的最小值即为最终答案。

2)代码

int search(int a[], int n, int x)
{
	int l = 0, r = n - 1;
	while(l < r)
	{
		int mid = (l + r) / 2;
		if (a[mid] >= x) r = mid;
		else l = mid + 1;
	}

	if (a[l] >= x) return a[l];
	else return -2e9;//说明没有找到,返回一个极小值(要求小于三个数组中最小的数)
}

int query(int s1[], int s2[], int s3[], int n1, int n2, int n3)
{
	int res = 2e9;//将res初始化为一个极大值(要求大于最终答案)
	for (int i = 0; i < n1; i ++ )
	{
		int minv = s1[i];
		int maxv = search(s2, n2, minv);
		maxv = max(maxv, search(s3, n3, minv));
		if (maxv == -2e9) break;//说明此时无论是s1,s2中都没有比当前xi大的数,退出循环。
		res = min(res, 2 * (maxv - minv));
	}
	return res;
}

int zhao(int s1[], int s2[], int s3[], int n1, int n2, int n3)//ni对应si的数组长度
{

	int ans = query(s1, s2, s3, n1, n2, n3);
	ans = min(ans, query(s2, s1, s3, n2, n1, n3));
	ans = min(ans, query(s3, s1, s2, n3, n1, n2));
	return ans;
}

3)时间复杂度Onlogn,空间复杂度O1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值