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