第二章 线性表 求三个数组的最小距离

#include <stdio.h>

using namespace std;

#define Min 0x7fffffff

/*
求三个升序数组的最小距离
1.算法思想
其实就是求出这三个数组的最相近的数
再求这三个数的距离
就是这三个数a-b绝对值加b-c绝对值加a-c绝对值
还是需要遍历一个死循环遍历到某一个数组完毕即可
需要一个变量min我们首先初始化min为一个足够大的数这里我们define了一个0x7fffffff
这个0x7fffffff就是三十二位计算机中带符号最大的整数
然后循环遍历三个数组求距离如果小于当前的min就赋值给min
求出三个数距离后要根据三个数中最小的元素在哪个数组中进行选择遍历哪个数组
因为三个数组都是升序的如果不是遍历当前最小的元素所在的数组
那么当前的最小数和一个更大的数距离只会越来越远 
所以我们选择遍历最小的数所在的数组
然后确定是i++还是j++还是k++
然后有一个返回绝对值函数
还有一个比较三个数的函数
这个函数我们定义的是bool型的始终看我们传入的第一个数是不是最小的即可
在另一个函数中只需要依次把数的位置改变即可
然后利用if判断进行执行各自的语句 
然后while循环直到有一个超出长度的位置
后面的也不用遍历了 因为三个数组都是升序 距离只会越来越大 
2.算法实现 
3.时间空间复杂度 
时间复杂度就是最短的那个数组大小是O(n)实际上n的系数应该乘3
但是省去系数就是n
空间复杂度为O(1) 
*/

int abs(int a){
    if(a<0){
        return -a;
    }else{
        return a;
    }

bool minn(int a,int b,int c){
    if(a<=b&&a<=c){
        return true;
    }else{
        return false;
    }

int findMinTrip(int a[],int b[],int c[],int na,int nb,int nc){
    int i=0,j=0,k=0,min;
    min=Min;
    while(i<na&&j<nb&&k<nc&&min>=0){
        int temp=abs(a[i]-b[j])+abs(b[j]-c[k])+abs(a[i]-c[k]);
        if(temp<min){
            min=temp; 
        }else{
            if(minn(a[i],b[j],c[k])){
                i++;
            }else if(minn(b[j],a[i],c[k])){
                j++;
            }else{
                k++;
            }
        }
    }
    return min;
}

int main(){
    int na=3;
    int nb=4;
    int nc=5;
    int a[na]={-1,0,9};
    int b[nb]={-25,-1,10,11};
    int c[nc]={2,9,17,30,41};
    int answer=findMinTrip(a,b,c,na,nb,nc);
    printf("最小距离为:%d\n",answer); 
}

上一篇:min-max 容斥小记


下一篇:11. 盛最多水的容器【双指针】