[经典面试题][阿里]三元组最小距离

题目

已知三个升序整数数组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) (每次循环总有一个下标走了一步)。

代码

    /*---------------------------------------------
    *   日期:2015-02-21
    *   作者:SJF0115
    *   题目: 三元组最小距离
    *   来源:阿里
    *   博客:
    -----------------------------------------------*/
    #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;
    }

如果有好的思路,可以留言。。。。。

时间: 2024-08-01 09:08:37

[经典面试题][阿里]三元组最小距离的相关文章

[经典面试题]在O(1)时间删除链表结点

[题目] 给定链表的头指针和一个结点指针,在O(1)时间删除该结点.链表结点的定义如下: struct ListNode {     int        value;     struct ListNode*  next; }; 函数的声明如下: void DeleteNode(ListNode* head,ListNode* node); [思路] 这是一道广为流传的Google面试题,能有效考察我们的编程基本功,还能考察我们的反应速度,更重要的是,还能考察我们对时间复杂度的理解. 在链表中

[经典面试题]将字符串里的小写字母转换成大写的。 要求不通过比较

[题目] 将字符串里的小写字母转换成大写的. 要求不通过比较 --------腾讯校招 [思路] a~z的ascii码:97~122 也就是:1100001~1111010 A~Z的ascii码:65~90 也就是: 1000001~1011010 通过判断从低位数第五位是否是0,1而得到是小写字母还是大写字母 [代码] /********************************* * 日期:2014-11-21 * 作者:SJF0115 * 题目: 将字符串里的小写字母转换成大写的.

PHP经典面试题集锦

 这篇文章主要介绍了PHP经典面试题集锦,搜集整理了常见的php面试题与相关的参考答案,供大家参考借鉴,需要的朋友可以参考下     本文较为详细的分析了PHP经典面试题.分享给大家供大家参考.具体如下: 做了一下网络上的php题目,不知不觉做到现在.....把答案贴出来,供参考之用. 1.用PHP打印出前一天的时间格式是2006-5-10 22:21:21(2分) ? 1 2 $a = date("Y-m-d H:i:s", strtotime("-1 day")

[经典面试题]子数组的最大乘积

题目 给定一个长度为N的整数数组,只允许用乘法,不能用除法,计算任意(N-1)个数的组合乘积中的最大的一组,并写出算法的时间复杂度. 思路一 穷举法 我们把所有可能的(N-1)个数的组合找出来,分别计算它们的乘积,并比较大小.由于总共有N个(N-1)个数的组合,总的时间复杂度为O(N^2),但显然这不是最好的思路. 思路二 空间换时间 计算(N-1)个数的组合乘积,假设第i个(0<=i<=N-1)元素被排除在乘积之外(如下图). 设num[]为初试数组 Left[i]表示前i个元素(包括第i个

[经典面试题]二分查找问题汇总

[算法]二分查找算法 1.[给定一个有序(非降序)数组A,可含有重复元素,求最小的i使得A[i]等于target,不存在则返回-1.] [题目] 给定一个有序(非降序)数组A,可含有重复元素,求最小的i使得A[i]等于target,不存在则返回-1. [分析] 此题也就是求target在数组中第一次出现的位置.这里可能会有人想先直接用原始的二分查找,如果不存在直接返回-1, 如果存在,然后再顺序找到这个等于target值区间的最左位置,这样的话,最坏情况下的复杂度就是O(n)了,没有完全发挥出二

[经典面试题][字典树]字符串唯一前缀问题

题目 一个文件里面有如下字符串 cartefdxh cart carlkijfwe chdfwef cafkekfld ---- 要从文件中找出唯一能代表该字符串的前缀,然后如下输出 cartefdxh carte cart cart carlkijfwe carl chdfwef ch cafkekfld caf 以空格分隔--. 思路 用Trie树实现.为每个节点增加一个变量count,用来记录一共有几个字符串使用该字符.找节点计数为1的节点或者叶子节点. 代码 /*------------

[经典面试题]最大连续乘积

题目 给一个浮点数序列,取最大乘积连续子串的值,例如 -2.5,4,0,3,0.5,8,-1,则取出的最大乘积连续子串为3,0.5,8.也就是说,上述数组中,3 0.5 8这3个数的乘积3*0.5*8=12是最大的,而且是连续的. 分析 最大乘积连续子串与最大乘积子序列不同,前者子串要求连续,后者子序列不要求连续.初看此题,自然会想到最大连续乘积问题类似于最大子数组和问题 思路一 穷举法 穷举子串的起点和终点. 代码一 /*------------------------------------

[经典面试题]二叉树宽度

(1)二叉树最大宽度 /*--------------------------------------------- * 日期:2015-03-07 * 作者:SJF0115 * 题目: 二叉树的最大宽度 * 来源:经典面试题 * 博客: -----------------------------------------------*/ #include <iostream> #include <queue> using namespace std; struct TreeNode

PHP经典面试题集锦_php技巧

本文较为详细的分析了PHP经典面试题.分享给大家供大家参考.具体如下: 做了一下网络上的php题目,不知不觉做到现在.....把答案贴出来,供参考之用. 1.用PHP打印出前一天的时间格式是2006-5-10 22:21:21(2分) $a = date("Y-m-d H:i:s", strtotime("-1 day")); print_r($a); 2.echo(),print(),print_r()的区别(3分) echo 和print不是一个函数,是一个语言