如何求最小三元组距离
时间:2022-04-29
本文章向大家介绍如何求最小三元组距离,主要内容包括方法一、方法二:最小距离法、基本概念、基础应用、原理机制和需要注意的事项等,并结合实例形式分析了其使用技巧,希望通过本文能帮助到大家理解应用这部分内容。
题目描述:
已知三个升序整数数组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],那么接下来有三种情况:
- 接下来求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)
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 }
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 宇智波程序笔记10-为什么你使用的 Spring Security OAuth 过期了
- 无线电侧信道攻击利用复现:监听显示器显示内容
- typeScript 配置文件该怎么写?
- 内网渗透:不出网渗透技巧
- Python自学成才之路 生成器的使用
- ent orm笔记2---schema使用(上)
- 力扣1514——概率最大的路径
- Pytest之自定义mark
- 全网首发 | 通达OA多枚0day漏洞分享
- ubuntu 解压rar文件
- 基于Hive进行数仓建设的资源元数据信息统计
- 我也没想到 Springboot + Flowable 开发工作流会这么简单
- k8s 调度
- k8s master机器文件系统故障的一次恢复过程
- 从0到1开发测试平台(十一)前端登录页面的编写及与后端登录接口的交互