2020统考真题-距离最小三元组

news2024/10/6 1:44:47

2020年统考真题

定义三元组$ (a,b,c)$ ( a,b,c 均为正数)的距离 D = ∣ a − b ∣ + ∣ b − c ∣ + ∣ c − a ∣ D=|a−b|+|b−c|+|c−a| D=ab+bc+ca 。给定 3个非空整数集合 S1 、 S2 和 S3 ,按升序分别存储在 3 个数组中。请设计一个尽可能高效的算法,让算并输出所有可能的三元组 (a,b,c) (其中 a ∈ S 1 , b ∈ S 2 , c ∈ S 3 a∈S1,b∈S2,c∈S3 aS1,bS2,cS3)中的最小距离。例如 S 1 = { − 1 , 0 , 9 } S1=\{−1,0,9\} S1={1,0,9} S 2 = { − 25 , − 10 , 10 , 11 } S2=\{−25,−10,10,11\} S2={25,10,10,11} S 3 = { 2 , 9 , 17 , 30 , 41 } S3=\{2,9,17,30,41\} S3={2,9,17,30,41} ,则最小距离为 2 ,相应的三元组为 ( 9 , 10 , 9 ) (9,10,9) (9,10,9) 。要求:

  1. 给出算法的基本设计思想。
  2. 根据设计思想,采用C或C++语言描述算法,关键之处给出注释。
  3. 说明你所设计算法的时间复杂度和空间复杂度。

设计思想

首先可以设想在一个数轴上,其有三个点分别为a,b,c(从小到大排序,如图)1673613732729

那我们可以得到如下关系:
L 1 = ∣ a − b ∣ L 2 = ∣ c − b ∣ L 3 = ∣ c − a ∣ L 1 + L 2 + L 3 = 2 ∣ c − a ∣ = 2 L 3 L_1 = |a-b|\\ L_2 = |c-b|\\ L_3 = |c-a|\\ L_1+L_2+L_3 = 2|c-a| = 2L_3 L1=abL2=cbL3=caL1+L2+L3=2∣ca=2L3
所以说,三元组中的距离只跟相距最大的两点有关!

所以说,我们想要获取到距离最短,那么改动b的位置是没有用的,甚至会让它距离更远(当b移动到 [ a , c ] [a,c] [a,c]外面以后)

所以我们只能移动a和c

但是由题目可以知道,三个数组中的数据都是按升序排序的,那么这就成为我们优化时间复杂度的一个突破口

都是升序排序。。。。对应到上面那张图就是:所有点只能从左向右移动!

那么在这一限制条件下,我们向右移动c肯定不是一个明智的想法,因为这只会让距离越来越大

那么b不能移动,c也不能移动,那我们只能移动a了,其实想一想,移动a确实可能能让距离更短

其实这道题我们可以想象一下,我们现在有一根橡皮筋,那么距离其实就是固定了橡皮筋a,c以后橡皮筋的长度,而我们要做的就是找出什么时候橡皮筋最松

好,继续说

由于我们上面所说,我们只能向右移动a,但是也有可能a移动太过了,比如超过了b,或者甚至超过了c,那么我们可以给它重新标个号,从左到右重新标为a,b,c

所以说到最后,其实这就变成了一道贪心题,我们不断尝试向右移动最小的那个点,看看能否让距离变短,不能就继续

那我们对比一下暴力求解的算法?

暴力求解时,我们会先固定i,j,然后一个个尝试k( i , j , k i,j,k i,j,k是数组A,B,C的下标, A [ i ] , B [ j ] , C [ k ] A[i],B[j],C[k] A[i],B[j],C[k]是上面所说的变换的a,b,c),但是我们会发现,无论怎么尝试,都只有当 A [ i ] ≤ C [ k ] ≤ B [ j ] A[i]\leq C[k]\leq B[j] A[i]C[k]B[j]时,才是当前状态(指当前固定好的i,j)的最小值,我们假设 A [ i ] ≤ C [ m . . . n ] ≤ B [ j ] A[i]\leq C[m...n]\leq B[j] A[i]C[m...n]B[j],那么m,n里面的比较是毫无意义的,因为我们知道它一定会是最小距离,而我们说了,我们是从左向右遍历序列的,所以我们很清楚,当k遍历到m时,再往后已经没有意义的,所以我们其实已经可以跳出循环了,当然,在固定i,k或者j,k时也是如此,所以我们不如使用三指针,让他们选一个最小的值,让其指针往右走,这才会造成真正我们需要的不同的状态,而不是那些越往后距离越大或者往后也没有变化的状态(这些状态是冗余的,没必要)

简而言之,只让最小的那个值往右走,这才会出现我们需要的尽可能小的状态!!!在这些状态中找最小值才是有效的!!!

最终的代码如下:

//p18 14
//求绝对值
#define MAX_INT 0x7fffffff;

int abs(int a){
    return a > 0 ? a : -a;
}

//a是否为最小值
bool isMin(int a,int b,int c){
    return a <= b && a <= c;
}

int findMinTrip(SqlList &L1,SqlList &L2,SqlList &L3){
    ElemType minTrap = MAX_INT;
    int i = 0,j = 0,k = 0;

    int len1 = L1.length,len2 = L2.length,len3  = L3.length;

    while (i<len1 && j < len2 && k<len3 && minTrap > 0)
    {
        int D = abs(L1.data[i] - L2.data[j]) + abs(L1.data[i] - L3.data[k]) + abs(L2.data[j] - L3.data[k]);


        minTrap = minTrap < D ? minTrap : D;

        if(isMin(L1.data[i],L2.data[j],L3.data[k])){
            i++;
        }
        else if(isMin(L2.data[j],L1.data[i],L3.data[k])){
            j++;
        }
        else if(isMin(L3.data[k],L1.data[i],L2.data[j])){
            k++;
        }
    }

    return minTrap;
        

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/160865.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

蓝队攻击的四个阶段(三)

目录 一&#xff0c; 专业技能储备 1.工具开发技能 2.漏洞挖掘技能 3.代码调试技能 4.侦破拓展技能 二&#xff0c;目标网情搜集 1 何为网情搜集 2. 网情搜集的主要工作 三&#xff0c; 网情搜集的途径 1.专业网站 2.专业开发资源网站 3.目标官网 一&#xff0c; 专…

算法训练营 day17 二叉树 平衡二叉树 二叉树的所以路径 左叶子之和

算法训练营 day17 二叉树 平衡二叉树 二叉树的所以路径 左叶子之和 平衡二叉树 110. 平衡二叉树 - 力扣&#xff08;LeetCode&#xff09; 给定一个二叉树&#xff0c;判断它是否是高度平衡的二叉树。 本题中&#xff0c;一棵高度平衡二叉树定义为&#xff1a; 一个二叉树每…

osg fbo(五) 通过shader计算纹理坐标并采样

在前边几节&#xff0c;纹理坐标数组是在生成geometry前指定的。 这里在shader里计算&#xff0c; 一&#xff0c;注释掉geometry中的纹理坐标 //osg::ref_ptr<osg::Vec2Array> texCoord new osg::Vec2Array; //texCoord->push_back(osg::Vec2(0.0, 0.0)); //texCoo…

1.13UART串口实验

UART总线&#xff1a; 异步全双工串行总线。用于芯片与外设之间的通信 UART通信协议&#xff1a; 空闲状态处于高电平 起始位&#xff1a;串口通信的起始标志 数据位&#xff1a;传输数据时先从低位开始传输&#xff0c;再传输高位 奇偶校验位&#xff1a; 奇校验&#x…

MacOS 系统中如何使用EF Core进行数据迁移?

原有 笔者最近在使用MacOS系统做asp.net core mvc项目开发。可是一直习惯了使用宇宙最强大的vs2019工具。突然换到苹果系统就感觉什么都是问题了。现在我将遇到该问题的解决方案做下记录&#xff0c;方便自己也是方便别的同学快速的解决问题。 发现有坑 其实最开始我也是翻阅…

RocketMQ 存储优化技术 解析——图解、源码级解析

&#x1f34a; Java学习&#xff1a;Java从入门到精通总结 &#x1f34a; 深入浅出RocketMQ设计思想&#xff1a;深入浅出RocketMQ设计思想 &#x1f34a; 绝对不一样的职场干货&#xff1a;大厂最佳实践经验指南 &#x1f4c6; 最近更新&#xff1a;2023年1月13日 &#x…

Django 后端没有接收到前端anxios的 post 内容

前端使用 vue 无论怎样 post 后端都说没有接收到值&#xff0c;&#xff08;后端接口正确&#xff09; 寻找原因&#xff1a; 1、前端查看自己的请求类型 Content-Type:application/json 我们的请求是这样的&#xff1a; axios({method:post,url:/video/upload,data:{"…

RedHat6配置本地yum源(最新超详细过程)

一、环境准备 挂载iso的镜像文件在CD/DVD驱动器上&#xff0c;需要确保&#xff0c;已连接已打开&#xff0c;且CD/DVD上的介质符合当前操作系统的版本。 挂载本地光盘到系统 在“编辑设置”——>“硬件”——>“CD/DVD驱动器”里指定操作系统的ISO镜像文件 光驱挂载…

web性能测试:Lighthouse测试实践

一工具简介 Lighthouse是Google开源的一个自动化工具&#xff0c;它可以搜集多个Web网页性能指标&#xff0c;分析Web应用的性能并生成报告&#xff0c;为开发人员进行性能优化提供了参考方向。1工作原理•Driver&#xff08;驱动&#xff09;—— 通过 Chrome Debugging Proto…

力扣sql基础篇(六)

力扣sql基础篇(六) 1 学生参加各科测试的次数 1.1 题目内容 1.1.1 基本题目信息 1.1.2 示例输入输出 a 输入示例 b 输出示例 1.2 示例sql语句 # 无论考没考试都要该科目这栏且无连接字段,就可以考虑笛卡尔积了 SELECT s.student_id,s.student_name,s.subject_name,IFNULL…

【软件STM32cubeIDE下STM32F4xx使用DMA+定时器推PWM+灯带WS2812-进阶-综合汇总(讲解移植相关)】

2TOC &#xff08;1&#xff09;前言 做灯带ws2812其实有一段时间了&#xff0c;中间遇到很多问题&#xff0c;从开始的学习&#xff0c;到后来慢慢熟悉&#xff0c;再到后来尝试点很多灯带&#xff0c;做过非常多的实验了&#xff0c;自己新建工程&#xff0c;几乎尝试过很多…

【Git】GitHub 操作

6、GitHub 操作 GitHub 网址&#xff1a;https://github.com/ Ps:全球最大同性交友网站&#xff0c;技术宅男的天堂&#xff0c;新世界的大门&#xff0c;你还在等什么? 账号姓名验证邮箱atguiguyueyue岳不群atguiguyueyuealiyun.comatguigulinghuchong令狐冲atguigulinghu…

72、PaletteNeRF: Palette-based Appearance Editing of Neural Radiance Fields

简介 官网:https://palettenerf.github.io/ 以(a)多视图照片为训练输入&#xff0c;重建NeRF并将其外观分解为一组(b)基于3D调色板的色基&#xff0c;实现了©直观和逼真的场景重新着色&#xff0c;在任意视图之间具有3D一致性&#xff0c;如(d)所示&#xff0c;该方法支…

人工智能与Python的渊源

人工智能起源与发展 文章目录人工智能起源与发展前言一、达特茅斯会议与人工智能起源二、人工智能发展的高峰与低谷Python与人工智能构建Python人工智能编程环境1.Python版本2.Anaconda编程环境数据处理常用算法2.1傅里叶变换2.1.1傅里叶分析的由来2.1.2傅里叶变换原理及应用傅…

MODBUS协议下,组态王与S7-1200能否建立无线通讯?

MODBUS协议下&#xff0c;想要组态王与S7-1200之间的无线通讯其实很容易。可采用了西门子PLC专用无线通讯终端DTD434MC&#xff0c;作为实现无线通讯的硬件设备&#xff0c;使用简单方便&#xff0c;不必深入理解 MODBUS 协议细节&#xff0c;无需更改网络参数直接替换有线连接…

波士顿房价预测—随机梯度下降法优化

根据我上一篇关于波士顿房价预测一文可以知道&#xff0c;如果使用梯度下降法&#xff0c;需要将所有的样本对梯度的贡献取平均&#xff0c;根据梯度更新参数。 但是面对海量样本的数据集&#xff0c;如果每次计算都使用全部的样本来计算损失函数和梯度&#xff0c;性能会很差&…

如何创建商用照明 App SDK 应用?

商用照明 App SDK 是专为照明行业的物联网应用提供的移动端开发工具。通过商用照明 SDK&#xff0c;大家可以形成完整的商用照明物联网控制系统&#xff0c;多协议兼容&#xff0c;完美满足绿色建筑的设备管理及能源管理要求。 什么是涂鸦商用照明&#xff1f; 涂鸦商用照明解…

python基础语法(1)

专栏&#xff1a;python 每日一句&#xff1a;人生&#xff0c;无非只有三天&#xff0c;昨天&#xff0c;今天&#xff0c;明天。昨天很长&#xff0c;说不清有多少天&#xff0c;但不管有多少天&#xff0c;不管是受到挫折&#xff0c;还是取得辉煌&#xff0c;都只能代表过去…

Feign

文章目录Http客户端Feign1、Feign替代RestTemplate1.1、RestTemplate方式调用存在的问题1.2、Feign介绍1.3、定义和使用Feign客户端2、Feign的自定义配置2.1、修改日志级别3、Feign的性能优化3.1、Feign的性能优化-连接池配置4、Feign的最佳实践4.1、方式一&#xff08;继承&am…

TypeScript类型 : any,unknown

1.any类 在某些情况下&#xff0c;我们确实无法确定一个变量的类型&#xff0c;并且可能它会发生一些变化&#xff0c;这个时候我们可以使用any类型&#xff08;类似 于Dart语言中的dynamic类型&#xff09;。 any类型有点像一种讨巧的TypeScript手段&#xff1a; 1.我们可以…