如何求最小三元组距离
2016-08-01 20:11
330 查看
题目描述:
已知三个升序整数数组a[l], b[m]和c
。请在三个数组中各找一个元素,使得组成的三元组距离最小。
三元组的距离定义是:假设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
思路:
接下来求a[i],b[j],c[k+1]的最小距离,因为c[k+1]>=c[k],所以,此时的最小距离为c[k+1]-a[i],肯定大于D
接下来求a[i],b[j+1],c[k]的最小距离,如果b[j+1]<=c[k],则最小距离不变,如果b[j+1]>c[k],此时的最小距离为b[j+1]-a[i],同样,肯定也是大于D
接下来求a[i],b[j+1],c[k]的最小距离,如果a[i+1] < c[k] + (c[k]-a[i]),则此时的最小距离显然会小于D.
所以,我们每次将最小的元素的index加1,才有可能将最小距离更优。所以,整体的思路是开始得出三个数组第一个元素的最小距离,接下来移动最小三个元素中最小元素的下标,与之前得到的最小距离比较,看是否需要更新最小距离,直到遍历完三个数组,时间复杂度为O(l+m+n)
已知三个升序整数数组a[l], b[m]和c
。请在三个数组中各找一个元素,使得组成的三元组距离最小。
三元组的距离定义是:假设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],那么接下来有三种情况:接下来求a[i],b[j],c[k+1]的最小距离,因为c[k+1]>=c[k],所以,此时的最小距离为c[k+1]-a[i],肯定大于D
接下来求a[i],b[j+1],c[k]的最小距离,如果b[j+1]<=c[k],则最小距离不变,如果b[j+1]>c[k],此时的最小距离为b[j+1]-a[i],同样,肯定也是大于D
接下来求a[i],b[j+1],c[k]的最小距离,如果a[i+1] < c[k] + (c[k]-a[i]),则此时的最小距离显然会小于D.
所以,我们每次将最小的元素的index加1,才有可能将最小距离更优。所以,整体的思路是开始得出三个数组第一个元素的最小距离,接下来移动最小三个元素中最小元素的下标,与之前得到的最小距离比较,看是否需要更新最小距离,直到遍历完三个数组,时间复杂度为O(l+m+n)
public static int minDistance(int [] a,int [] b, int [] c){ int curDis = 0 ; int min = 0 ; int minDis = Integer.MIN_VALUE ; int i = 0 ; int j = 0 ; int k = 0 ; while(i < a.length && j < b.length && k < c.length){ curDis = max(Math.abs(a[i]-b[j]),Math.abs(a[i]-c[k]),Math.abs(b[j]-c[k])) ; if(curDis < minDis){ minDis = curDis ; } min = min(a[i], b[j], c[k]) ; if(min == a[i]){ i++ ; }else if(min == b[j]){ j++ ; }else{ k++ ; } } return minDis ; } private static int max(int a, int b, int c) { int max = a > b ? a : b ; max = max > c ? max : c ; return max ; } private static int min(int a, int b, int c) { int min = a < b ? a : b ; min = min < c ? min : c ; return min ; }
相关文章推荐
- 通达信:显示K线图日期
- C#中 如何处理 JSON中的特殊字符
- Set重写hashCode()和equals()的实例
- python线程池实现bug的修改
- Eratosthenes筛选法
- PHP中实现二分法查找的两种方法
- 栈在表达式求值中的应用
- 堆栈和栈
- Scala 函数式编程进阶 (1)
- Java Basics Part 14/20 - Arrays
- 111.You are installing Oracle Database 11g on a machine. When you run the installer, the Oracle Univ
- Java并发编程:深入剖析ThreadLocal
- 文章标题
- HDOJ-1852 More is better
- hdu 5672 尺取还是挺好用的
- zabbix-3.0.4 + nginx-1.8.1 + php-5.6.17 + mysql-5.6.16
- 1104. Sum of Number Segments (20)
- HDU 1272 小希的迷宫【并查集判断无向图回路】
- 项目优化涉及到的相关文章
- Obeject内的方法