前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >如何求最小三元组距离

如何求最小三元组距离

作者头像
mukekeheart
发布2018-02-27 15:31:01
1.4K0
发布2018-02-27 15:31:01
举报

题目描述:

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

代码语言:javascript
复制
 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 }
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2016-08-01 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 方法一
  • 方法二:最小距离法
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档