已知三个升序整数数组a[l], b[m]和c[n]。请在三个数组中各找一个元素,是的组成的三元组距离最小。三元组的距离定义是:假设a

本文介绍了一种求解三个升序数组中最小三元组距离的算法,通过比较数组中元素间的最大值和最小值,不断调整指针位置以找到最小距离。算法的时间复杂度为O(l+m+n),适用于寻找多数组间最接近的元素组合。

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

/*
已知三个升序整数数组a[l], b[m]和c[n]。请在三个数组中各找一个元素,是的组成的三元组距离最小。三元组的距离定义是:假设a[i]、b[j]和c[k]是一个三元组,那么距离为:
Distance = max(|a[ I ] – b[ j ]|, |a[ I ] – c[ k ]|, |b[ j ] – c[ k ]|)

请设计一个求最小三元组距离的最优算法,并分析时间复杂度。
---------------------
作者:葫芦赛赛
来源:优快云
原文:https://blog.youkuaiyun.com/huruzun/article/details/28239925
版权声明:本文为博主原创文章,转载请附上博文链接!

思路:最短三元组实际上就是最小值和最大值之间的距离,因为均为递增数组所以要让他们隔的最近才可以使之间的距离最小,所以每次就需要向前移动
*/
#include<stdio.h>
#include<math.h>
int GetMin(int a,int b,int c)
{
    if(a<b)
    {
        if(a<c)
            return a;
        else
            return c;
    }
    else if(b<c)
    {
        return b;
    }
    else
    {
        return c;
    }
}
int GetMax(int a,int b,int c)
{
    if(a>b)
    {
        if(a>c)
            return a;
        else
            return c;
    }
    else if(b>c)
    {
        return b;
    }
    else
    {
        return c;
    }
}

int MinDistance(int a[],int b[],int c[],int i,int j,int k)
{
    int x=0,y=0,z=0;
    int tempMin=GetMax(a[x],b[y],c[z])-GetMin(a[x],b[y],c[z]);
    int Min=GetMax(a[x],b[y],c[z])-GetMin(a[x],b[y],c[z]);
    while(x<i && y<j && z<k)
    {
        int num = GetMin(a[x],b[y],c[z]);
        if(Min>tempMin)
            Min=tempMin;
        if(a[x] == num)
            x++;
        if(b[y] == num)
            y++;
        if(c[z] == num)
            z++;
        tempMin = GetMax(a[x],b[y],c[z])-GetMin(a[x],b[y],c[z]);
    }
    printf("%d %d %d\n",a[x-1],b[y-1],c[z-1]);
    return Min;
}

int main()
{
int a[] = {5,16,20};
int b[] = {13,14,15,17,35};
int c[] = {19,22,24,29,32,42};
int i=sizeof(a)/sizeof(int);
int j=sizeof(b)/sizeof(int);
int k=sizeof(c)/sizeof(int);
printf("%d",MinDistance(a,b,c,i,j,k));

//printf("%d",GetMax(89000,8,9));
return 0;
}
算法复杂度为O(l+m+n)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值