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

题目

已知三个升序整数数组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* 题目: 三元组最小距离* 来源:阿里* 博客:———————————————–*/;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;}//ifint 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;}//ifif(a[i] < b[j]){if(a[i] < c[k]){++i;}//ifelse{++k;}//else}//ifelse{if(b[j] < c[k]){++j;}//ifelse{++k;}//else}//else}//forcout<<“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;}

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

有人要进来,有一些人不得不离开。

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

相关文章:

你感兴趣的文章:

标签云: