完整教程:2020年_408统考_数据结构41题

news/2025/9/23 10:37:20/文章来源:https://www.cnblogs.com/yxysuanfa/p/19106725

题目

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

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

1.算法基本设计思想

先写出初始数组

在这里插入图片描述
D = |a - b| + |b - c| + |c - a|,这道题的最终结果就是求出 D 的最小值,不妨先画出数轴来帮助我们理解一下这到底是什么意思,这里以S1[2],S2[2],S3[0]为例:

红色代表S1, 绿色代表S2,蓝色代表S3
在这里插入图片描述

在这里插入图片描述
如图:开始推算,|a-b|=1 |b-c|=8 |c-a|=7 相加得出 d = 16,由此得出 D = (最右端 - 最左端 )*2,所以就要求 左端点的值尽可能的大 ,右端点的值尽可能的小(由于数组是递增的,当前选定的右端点一定为最小值),在数轴中小的数在最左边,所需要确认一个a,b,c中的最小值来做左端点,不断的去匹配,例如:
(题目中要求a,b,c大于0,我们示范时忽略这个条件)
在这里插入图片描述
D=(2-(-25))*2 = 54
由于 a.b.c中 b的值最小,所以b做了左端点,继续匹配,b的值是当前的最小值(需要不断偏移左端点,使其变大),存在于S2中,所以更改 b 为 -10
在这里插入图片描述
D=(2-(-10))*2 = 24

继续重复 ,更新b的值为10
在这里插入图片描述
D=(10-(-1))* 2 = 22

此时,左端点变为了 a ,将其更新
在这里插入图片描述
D=(10-0)*2 = 20

继续:
在这里插入图片描述
此时,左端点变为了 c ,更新:

在这里插入图片描述
得出了答案,D=(10-9)*2此时继续更新,同时更新 a,c,发现 a 最高到 9 不能再向后偏移了,也就是说下次如果还是当前左端点最小的话,左端点的值就定死了,只能不断更新右端点(如果按照此例子来解释,就是 当前a已经是 a,b,c中最小的了,由于数组是递增的,那么b和c之后的值一定会更大,不断的更新右端点 )不断向前,最终导致D的值不断增大,继续移动 a 的指针会越界,因此只能移动其他最小值的指针,当至少有一个到达对应数组的末尾时,遍历必须终止:
在这里插入图片描述
D=(17-9)*2 = 16

下来,根据数轴来推断,那么该如何将D变小呢?

推论

当 :大家确定

  • 左端点朝右移,已知其余两个点的值,通过公式D = |a - b| + |b - c| + |c - a|
  • 为什么知道其余两个点的值?
    -当我们不断的移动当前 a (S1 [i])、b (S2 [j])、c (S3 [k]) 中的最小值,若最小值所在数组的指针未越界,则移动该指针,会出现三种情况
    1. 更新的左端点的值还是最小值,其余两个点的值不变,由于数组递增,获取的新左端点一定比之前的左端点值大
    2. 更新的左端点的值在原来右端点和当前左节点(已经替换)之间,当前左节点的值,在未更新前就已经知道,由于更新过后的左端点的值比原来左端点的值大,例如:
    在这里插入图片描述
    更新的左端点的值要在原来右端点和新的左端点(2)之间,所以取更新的左端点为 3
    在这里插入图片描述
    减小的就是重新获取当前左端点,为 2 ,由此可知,获取的当前左端点的值一定是大于上一个左端点,但是右端点还是没有变,所以依旧行确定三个点的位置,通过公式得出D依旧
    3. 更新的左端点的值在原来右端点之后,如图;
    在这里插入图片描述
    按照解释,更新的值应从 -10 更新为大于 5 的值
    - 要是更新的值 等于 17(5+2+10) ,那么D值不变
    - 如果更新的值 小于 17 ,那么D值减小
    - 如果更新的值 大于 17 ,那么D的值增大
    大家每次计算D的之后,都会令其和之前的D比较,发现小于之前的D,更新答案,就避免了此种,还没有遍历完D就增大的情况

算法思路

通过遍历数组,从 0 索引开始,同时获取S1,S2, S3的元素,通过不断的比较,来确定左端点,然后不断的更新最小的数,不断更新左节点,不断的计算D,以获得最终答案

代码实现;

/*************************************************************************
> File Name: solve.cpp
> Author:
> Mail:
> Created Time:
************************************************************************/
/*************************************************************************
* 题目:计算三个有序数组中元素组成的三元组的最小距离
* 算法思路:
* 1. 利用三指针法遍历三个有序数组
* 2. 每次计算当前三个元素的距离 D = |a-b| + |b-c| + |c-a|
* 3. 选择三个元素中最小的那个元素,前进其所在数组的指针
* 4. 重复上述过程直到任一数组遍历完毕
* 5. 在整个过程中记录最小距离
************************************************************************/
#include <iostream>#include <cstdlib>#include <queue>using namespace std;int min_num(int a, int b, int c) {if (a > b) swap(a, b);if (a > c) swap(a, c);return a;}int func(queue<int> que1, queue<int> que2, queue<int> que3) {int ans = 0x3f3f3f3f;//设置answhile (!que1.empty() &&!que2.empty() &&!que3.empty()){int a = que1.front(), b = que2.front(), c = que3.front();int D = abs(a - b) + abs(b - c) + abs(c - a);ans = min(ans, D);int new_left = min_num(a, b, c);if (a == new_left) que1.pop();if (b == new_left) que2.pop();if (c == new_left) que3.pop();//操作完毕之后已经获得了最新的指针位置}return ans;}int main() {int m, n, k, x;queue<int> que1, que2, que3;cin >> m >> n >> k;for (int i = 0; i < m; i++) {cin >> x;que1.push(x);}for (int i = 0; i < n; i++) {cin >> x;que2.push(x);}for (int i = 0; i < k; i++) {cin >> x;que3.push(x);}cout <<func(que1, que2, que3) << endl;return 0;}

这个算法的时间复杂度为:

时间复杂度:

empty(): O(1) - 队列判断是否为空是常数时间

front(): O(1) - 获取队首元素是常数时间

pop(): O(1) - 弹出队首元素是常数时间

min_num() 中的 swap(): O(1) - 交换两个整数值是常数时间

abs(): O(1) - 绝对值计算是常数时间

min(): O(1) - 比较两个数是常数时间

循环最多执行 (m + n + k) 次

时间复杂度:O(m + n + k)

空间复杂度

空间复杂度:O(m + n + k)

值传递,创建了三个队列的副本就是由于

每个队列分别要求 O(m)、O(n)、O(k) 空间

因此总空间复杂度为 O(m + n + k)

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

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

相关文章

[原创]《C#高级GDI+实战:从零开发一个流程图》第10章:鼠标拖动完成连线、拖动时实时显示半透明虚线连线效果、自定义连接点样式

一、前言 上节课程我们实现了连接形状不同的连接点,但在实际使用中会发现很繁琐,需要分别指定开始形状和结束形状的连接点,这明显不符合操作经验逻辑。我们本节课程就来实现鼠标拖动完成连线,拖到哪个连接点就对哪…

修改Abp中Auto API Controllers中 默认生成的 Put、Delete请求

在做公家的项目,有个奇葩的规定,Http请求 不能用Put和Delete。 怎么在使用Abp,自动生成的Api,全局修改原有规则,将修改、删除都改成Post呢? 只需要,在Host项目的XXXModule类中,重写的PreConfigureServices方法…

dedecms做网站网站界面设计分析

一、文件的基本权限权限&#xff1a;r, w, x对于文件来讲&#xff0c;r:&#xff1a;可读&#xff0c;可以使用类似cat等命令查看文件内容&#xff1b;w:可写&#xff0c;可以编辑或删除此文件&#xff1b;x:可执行&#xff0c;exacutable&#xff0c;可以命令提示符下当作命令…

博物馆网站微信公众号建设方案网站未备案 打不开

先安装MMEdu库&#xff01; MMEdu安装&#xff1a;https://blog.csdn.net/zyl_coder/article/details/132483865 下面的代码请在Jupyter上运行&#xff0c;并自己准备数据集。若模型还未训练&#xff0c;请先在本地训练完模型后再进行模型推理。 import cv2 capture cv2.Vi…

公司和公司网站的关系男孩子和男孩子在一起怎么做网站

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 单片机家电产品–OC门电路 前言 记录学习单片机家电产品内容 已转载记录为主 一、知识点 1OC门电路和OD门电路的区别 OC门电路和OD门电路的区别 OC门&#xff1a;三极管…

红叶网站建设方案广州建立网站的公司网站

智能优化算法应用&#xff1a;基于非洲秃鹫算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于非洲秃鹫算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.非洲秃鹫算法4.实验参数设定5.算法结果6.…

传媒免费网站建设易语言做网站教程

随着人工智能技术不断深入实际应用场景&#xff0c;加速各行各业场景应用落地&#xff0c;边缘计算的重要性越发凸显。相较于传统的集中式云计算&#xff0c;边缘计算在距离数据源或用户更近的地方提供计算能力&#xff0c;不仅满足了对实时性要求较高的场景应用需求&#xff0…

免费创建企业网站阿里云 两个网站

1&#xff0c;将一个字符串转换为整数 在C语言中&#xff0c;可以使用库函数 atoi() 将字符串转换为整数。 atoi() 函数接受一个字符串作为参数&#xff0c;并返回其对应的整数。 以下是一个示例代码&#xff0c;演示如何使用 atoi() 函数将字符串转换为整数&#xff1a; #i…

河北网站备案 多长时间通过网站建设中项目经理的职责

目前 前言HarmonyOS 应用/服务发布的重要性使用HarmonyOS 构建跨设备的应用生态前期准备工作简述发布流程生成签名文件配置签名信息编译构建.app文件上架.app文件到AGC结束语 前言 随着智能设备的快速普及和多样化&#xff0c;以及编程语言的迅猛发展&#xff0c;构建一个无缝…

电阻-温度数据拟合工具(最小二乘法)

代码(html)<!DOCTYPE html> <html lang="zh-CN"> <head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=…

delphi clientdataset 中文过滤问题

为了不待midas.dll 引用了MidasLib 单元,这样中文过滤就得两个字才能过滤出来。比如 like %高% 是过滤不出来的,要like %高深% 经测试,去掉MidasLib ,则正常。带上dll

基于 systemd 的 Go 应用自动化部署完整指南

目录基于 systemd 的 Go 应用自动化部署完整指南部署流程总览详细部署流程1. 环境准备阶段1.1 前置条件检查1.2 系统用户创建1.3 目录结构建立2. 应用部署阶段2.1 文件复制与权限设置2.2 systemd 服务文件配置3. 服务配…

马来西亚股票数据API对接文档

马来西亚股票数据API对接文档本文档提供StockTV马来西亚股票市场(Bursa Malaysia)数据API的完整对接指南,包含实时行情、历史数据、公司信息等核心功能一、接口概览 1.1 支持交易所交易所代码 交易所名称 覆盖股票数量…

电子类网站建设wordpress文章名加后缀

在 Apache Flink 中&#xff0c;时间在流处理中是一个重要的概念&#xff0c;而时间语义则用于定义事件发生的时间。Flink 支持三种时间语义&#xff0c;分别是&#xff1a; Processing Time&#xff08;处理时间&#xff09;&#xff1a; 以机器的系统时间为基准&#xff0c;…

网站建设下单源码莱芜金点子信息港二手市场

参考 ​​​​​​【RabbitMQ】RabbitMQ架构模型_rabbitmq结构模型-CSDN博客 之前的学习都只是知道名字&#xff0c;但并没有真正的理解&#xff0c;每次看还是不懂&#xff0c;所以今日理解透 &#xff01; RabbitMQ 收发消息过程如下&#xff1a; 首先从消费者开始&#xff1…

深圳建企业网站公司云主机 asp 网站

1. 简述 SVM涉及的东西很多&#xff0c;如果要理解全面的话&#xff0c;要理解经验风险与置信风险&#xff0c;VC维理论&#xff0c;推导出最优化公式&#xff0c;最优化求解的拉格朗日解法&#xff0c;核函数&#xff0c;等等方面的内容&#xff0c;当前对SVM理解太少&#xf…

网站开发架构分类58同城推广电话

简介&#xff1a; 如何使用Spark On MaxCompute连接Phonix&#xff0c;将Hbase的数据写入到MaxCompute的对应表中&#xff0c;目前没有对应的案例&#xff0c;为了满足用户的需求。本文主要讲解使用Spark连接Phonix访问Hbase的数据再写入到MaxCompute方案实践。该方案的验证是使…

tuzicms做企业手机网站如何上海 房地产网站建设

一、消息队列消息队列中间件是分布式系统中重要的组件&#xff0c;主要解决应用耦合、异步消息、流量削锋等问题&#xff0c;实现高性能、高可用、可伸缩和最终一致性架构&#xff0c;是大型分布式系统不可缺少的中间件。目前在生产环境中使用较多的消息队列有ActiveMQ、Rabbit…

网站架构设计图怎么做wordpress网站如何播放视频

组合评价模型—模糊Borda(Matlab) 我们的征途是星辰大海&#xff0c;而并非烟尘人间。 目录 组合评价模型—模糊Borda(Matlab) 一、模糊Borda法简介 二、模糊Borda法主要步骤 &#xff08;1&#xff09;计算隶属度 &#xff08;2&#xff09;计算模糊频数 &#xff08;…

门源县住房和城乡建设局网站wordpress+悬浮+登录

目录 欧拉函数一、用公式求代码 二、线性筛法求欧拉函数扩展欧拉定理 欧拉函数 AcWing 873. 欧拉函数 一、用公式求 定义&#xff1a;1 ~ N 中与 N 互质的数的个数被称为欧拉函数&#xff0c;记为ϕ(N)。 怎么求呢&#xff1f;&#xff1f; 有一个公式&#xff1a; N p1a1 X…