• 三元组最小距离


      已知三个升序整数数组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 ]|)

      请设计一个求最小三元组距离的最优算法,并分析时间复杂度。

    思路

    保持三个下标索引 i,j,k,找出a[i],b[j],c[k]里最小的元素。如果a[i]最小, 则下一次循环 i=i+1, 其他两个索引不变。如果b[j]最小, 则下一次循环 j=j+1, 其他两个索引不变。如果c[k]最小, 则下一次循环 k=k+1, 其他两个索引不变。如此循环,直至最小的数对应的下标到达该数组尾部。记录最小距离。
    这里写图片描述
    时间复杂度:O(l+m+m) (每次循环总有一个下标走了一步)。

    代码

    
        #include <iostream>
        #include <climits>
        #include <algorithm>
        using namespace std;
    
        class Solution {
        public:
            int MinDistance(int a[],int l,int b[],int m,int c[],int n){
                if(l <= 0 || n <= 0 || m <= 0){
                    return -1;
                }//if
                int min = INT_MAX;
                int dis = 0,first = 0,second = 0,third = 0;
                for(int i = 0,j = 0,k = 0;i < l && j < m && k < n;){
                    dis = max(max(abs(a[i]-b[j]),abs(a[i]-c[k])),abs(b[j]-c[k]));
                    if(dis < min){
                        min = dis;
                        first = i;
                        second = j;
                        third = k;
                    }//if
                    if(a[i] < b[j]){
                        if(a[i] < c[k]){
                            ++i;
                        }//if
                        else{
                            ++k;
                        }//else
                    }//if
                    else{
                        if(b[j] < c[k]){
                            ++j;
                        }//if
                        else{
                            ++k;
                        }//else
                    }//else
                }//for
                cout<<"First->"<<first<<" Second->"<<second<<" Third->"<<third<<endl;
                return min;
            }
        };
    
    
        int main() {
            Solution solution;
            int a[] = {5,16,20};
            int b[] = {13,14,15,17,35};
            int c[] = {19,22,24,29,32,42};
            int l = 3,m = 5,n = 6;
            int result = solution.MinDistance(a,l,b,m,c,n);
            cout<<result<<endl;
        }
  • 相关阅读:
    python模拟android屏幕高频点击工具
    android adb shell and monkey 学习记录
    appium+python环境搭建
    python监控接口请求
    JetBrains Pycharm 破解+汉化
    loadrunner调用jar包方法
    python抢小米6自动化脚本
    CDlinux制作U盘启动盘,打造自己的口袋系统
    无线渗透测试之wifi密码破解
    测试-test1
  • 原文地址:https://www.cnblogs.com/wxgblogs/p/5780266.html
Copyright © 2020-2023  润新知