zoukankan      html  css  js  c++  java
  • 如何求最小三元组距离

    题目描述:

      已知三个升序整数数组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 }
  • 相关阅读:
    高盛、沃尔玛 题做出来还挂了的吐槽
    amazon师兄debrief
    到所有人家距离之和最短的中点 296. Best Meeting Point
    问问题没人回答的情况怎么办终于有解了
    找名人 277. Find the Celebrity
    数组生存游戏 289. Game of Life
    547. Number of Provinces 省份数量
    428. Serialize and Deserialize Nary Tree 序列化、反序列化n叉树
    alias别名简介和使用
    面试官:线程池执行过程中遇到异常会发生什么,怎样处理? Vincent
  • 原文地址:https://www.cnblogs.com/mukekeheart/p/5727106.html
Copyright © 2011-2022 走看看