题目描述:

  已知三个升序整数数组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]|)请设计一个求最小三元组距离的最优算法,并分析时间复杂度。

  关键公式:max(|a[i]–b[j]|,|a[i]–c[k]|,|b[j]–c[k]|) = (abs(a[i]-b[j])+abs(a[i]-c[k])+abs(b[j]-c[k]))/2

思路:

方法一

  暴力法,三层循环,时间复杂度为O(l*m*n)

方法二:最小距离法

  假设当前遍历到的这三个数组中的元素分别为a[i],b[j],c[k],并且有a[i]<=b[j]<=c[k],则最小距离肯定是D = c[k]-a[i],那么接下来有三种情况:

  1. 接下来求a[i],b[j],c[k+1]的最小距离,因为c[k+1]>=c[k],所以,此时的最小距离为c[k+1]-a[i],肯定大于D
  2. 接下来求a[i],b[j+1],c[k]的最小距离,如果b[j+1]<=c[k],则最小距离不变,如果b[j+1]>c[k],此时的最小距离为b[j+1]-a[i],同样,肯定也是大于D
  3. 接下来求a[i],b[j+1],c[k]的最小距离,如果a[i+1] < c[k] + (c[k]-a[i]),则此时的最小距离显然会小于D.

  所以,我们每次将最小的元素的index加1,才有可能将最小距离更优。所以,整体的思路是开始得出三个数组第一个元素的最小距离,接下来移动最小三个元素中最小元素的下标,与之前得到的最小距离比较,看是否需要更新最小距离,直到遍历完三个数组,时间复杂度为O(l+m+n)

 1 public static int minDistance(int [] a,int [] b, int [] c){
 2     int curDis = 0 ;
 3     int min = 0 ;
 4     int minDis = Integer.MIN_VALUE ;
 5     int i = 0 ;
 6     int j = 0 ;
 7     int k = 0 ;
 8
 9     while(i < a.length && j < b.length && k < c.length){
10         curDis = max(Math.abs(a[i]-b[j]),Math.abs(a[i]-c[k]),Math.abs(b[j]-c[k])) ;
11         if(curDis < minDis){
12             minDis = curDis ;
13         }
14
15         min = min(a[i], b[j], c[k]) ;
16         if(min == a[i]){
17             i++ ;
18         }else if(min == b[j]){
19             j++ ;
20         }else{
21             k++ ;
22         }
23     }
24     return minDis ;
25 }
26
27 private static int max(int a, int b, int c) {
28     int max = a > b ? a : b ;
29     max = max > c ? max : c ;
30     return max ;
31 }
32
33 private static int min(int a, int b, int c) {
34     int min = a < b ? a : b ;
35     min = min < c ? min : c ;
36     return min ;
37 }

转载于:https://www.cnblogs.com/mukekeheart/p/5727106.html

如何求最小三元组距离相关推荐

  1. 求最小Hamming距离的DNA序列

    提示:两个等长字符串的Hamming距离,等于两个字符串相同的位置中,字符不同的个数.(如ACGT和GCGA的Hamming距离为2) 问题: TATGATAC TAAGCTAC AAAGATCC T ...

  2. Python访问街区10个点,并俩俩绘制一条线,得到5条线,求最短的距离和?

    Python访问街区10个点,并俩俩绘制一条线,得到5条线,求最短的距离和? 1. 效果图 2. 源码 参考 上一篇博客介绍了Python访问街区所有节点最短路径问题,并结合matplotlib可视化 ...

  3. Bridge Across Islands POJ - 3608 旋转卡壳求凸包最近距离

    \(\color{#0066ff}{题目描述}\) 几千年前,有一个小王国位于太平洋的中部.王国的领土由两个分离的岛屿组成.由于洋流的冲击,两个岛屿的形状都变成了凸多边形.王国的国王想建立一座桥来连接 ...

  4. 如何用法向量求点到平面距离_支持向量机(SVM)

    最近完成的一个项目用到了SVM,之前也一直有听说支持向量机,知道它是机器学习中一种非常厉害的算法.利用将近一个星期的时间学习了一下支持向量机,把原理推了一遍,感觉支持向量机确实挺厉害的,尤其是核函数变 ...

  5. 如何用法向量求点到平面距离_高中数学丨2020新标课本,空间向量与二面角所有知识点,一张表搞定...

    建立空间直角坐标系常用方法: 1.底面是正方形,常以底面两条临边x轴,y轴: 2.底面是菱形,常以底面两条对角线为x轴,y轴: 3.底面是等腰三角形,常以底边及底边上的高为x轴,y轴: 4.底面为平行 ...

  6. UVA11889(给出lcm(A,B)=C中的AC求最小的B)

    题意:      给出最小公倍数LCM(A,B) = C中的A,C求最小的B. 思路:       lcm=(a*b)/gcd,把等号两侧同时除以a得到lcm/a=b/gcd左侧是已知的,右侧的gcd ...

  7. [转载]根据两点的经纬度求方位角和距离,等

    转:http://blog.sina.com.cn/s/blog_658a93570101hynw.html 原文地址:根据两点的经纬度求方位角和距离,等作者:多乎哉不多也多亦不多乎实乃少也 最近自己 ...

  8. 距离矢量算法matlab实现,一种基于最小费用距离模型的城市生态网络构建方法与流程...

    本发明涉及生态网络构建技术领域,特别是涉及一种城市网络的构建方法. 背景技术: 最小费用距离是网络分析的一种计算方法,这种方法被用于物种保护.自然保护区功能规划.动物栖息地的确定.区域生态安全格局设计 ...

  9. 试除法求最小N个素数之二

    Trial division 试除法求最小N个素数是一个经典的算法. 这个算法不同于前一个版本<试除法求最小N个素数>的方法,也是一个比较快速的方法. 这个算法考虑以下两点: 1.偶数中只 ...

  10. 一种更简单的求最小平方均值函数(MSE)的方法 -- 梯度下降法。

    在上一篇博客中我们通过解析解法算出来了 但是上面公式中的对称阵是N维乘以N维的,复杂度为O(n*n*n),虽然很精准但是很慢. 为此我们引入梯度下降法 我们首先大致画出MSE的图像,MSE是一个开口向 ...

最新文章

  1. vue的列表交错过渡
  2. git add失效问题以及git status结果与github网页结果不一致(转载+自己整理)
  3. VS Code 黑宝书背后的故事
  4. git解除与远程分支的关联
  5. mysql5.6 排序失效_mysql 使用union(all) + order by 导致排序失效
  6. Linux中MongoDB创建数据库
  7. 笑脸哭脸循环c语言,买卖信号(哭脸笑脸)选股公式(源码)
  8. Bailian3195 最大公约数【数论】
  9. 验证服务器支持ipv6,支持IPv6的Radius服务器的配置过程
  10. 浪潮ssr服务器安全加固系统贵吗,浪潮SSR加固服务器安全
  11. HTML5期末大作业:我的家乡网站设计4
  12. IDM6.39最新版补丁新增功能介绍
  13. 源码:winamp播放器 C++
  14. ecshop插件-免费ecshop插件-ecshop插件应用中心
  15. 数据挖掘4:自然语言处理(NLP)信息提取技术
  16. linux vi 选中某一列,在 Vim 中进行文本选择操作和使用标志
  17. 大智慧365除权数据导出存通达信板块源码+工具
  18. 集五福1 python
  19. vim终极编辑器配置
  20. Histograms of Oriented Gradients (HOG)理解和源码

热门文章

  1. 微信小程序云开发教程-JavaScript入门(5)-函数异步同步
  2. Linux系统中运行jar包的四种方式
  3. tcpdf html 格式重叠,使用TCPDF进行HTML呈现(PHP)
  4. Leetcode200岛屿数量(深搜)
  5. 加载PageOffice控件失败。 当前浏览器是42版本以上的谷歌浏览器,建议采用POBrowser技术打开PageOffice即可。
  6. Jquery学习 -千锋学习
  7. 在springboot中一些框架和插件的配置
  8. js 音乐播放器(audio属性及其使用方法)
  9. 聊聊缓存淘汰算法-LRU 实现原理
  10. HTML/CSS/js 日期等其他函数 相关收藏