【每日一题】2020年考研数据结构 - 求最短三元组

本题要求我们在三个非空整数集合中各取一个元素构成三元组,使其具有最小的距离。

题目描述

定义三元组 ( ( a , b , c ) ) ((a, b, c)) ((a,b,c)) 的距离 ( D = ∣ a − b ∣ + ∣ b − c ∣ + ∣ c − a ∣ ) (D = |a - b| + |b - c| + |c - a|) (D=ab+bc+ca)。给定三个按升序排序的非空整数集合 ( S 1 , S 2 , S 3 ) (S_1, S_2, S_3) (S1,S2,S3),分别存储在数组 ( a , b , c ) (a, b, c) (a,b,c) 中。设计一个尽可能高效的算法,计算并输出所有可能三元组中的最小距离。

示例输入:

S1 = {-1, 0, 9}
S2 = {-25, -10, 10, 11}
S3 = {2, 9, 17, 30, 41}

示例输出:

最小距离:2
对应三元组:(9, 10, 9)

解题思路

暴力解法

暴力解法的核心思想是,遍历三个集合中所有可能的三元组 ( a , b , c ) (a, b, c) (a,b,c),计算其距离 D D D,并记录其中最小的距离值。具体步骤如下:

  1. 利用三重循环,分别遍历数组 a a a b b b c c c 中的每个元素。
  2. 对于每个三元组 ( ( a [ i ] , b [ j ] , c [ k ] ) ) ((a[i], b[j], c[k])) ((a[i],b[j],c[k])),计算其距离 ( D ) (D) (D)
  3. 在所有三元组中找到最小的 ( D ) (D) (D) 及其对应的三元组。

代码实现:

#include <iostream>
#include <vector>
#include <climits>
#include <cmath>
#include <tuple>
using namespace std;tuple<vector<int>, int> brute_force(vector<int> a, vector<int> b, vector<int> c) {int minValue = INT_MAX;vector<int> ans;for (int ai : a) {for (int bi : b) {for (int ci : c) {int dist = abs(ai - bi) + abs(bi - ci) + abs(ci - ai);if (dist < minValue) {minValue = dist;ans = {ai, bi, ci};}}}}return {ans, minValue};
}int main() {vector<int> a = {-1, 0, 9};vector<int> b = {-25, -10, 10, 11};vector<int> c = {2, 9, 17, 30, 41};auto [result, minDist] = brute_force(a, b, c);cout << "最小距离: " << minDist << endl;cout << "对应三元组: ";for (int val : result) cout << val << " ";cout << endl;return 0;
}

优化解法:双指针法

通过双指针法可以大幅提升效率。由于三个集合都是按升序排列的,我们可以分别在三个集合中使用指针 ( p 1 , p 2 , p 3 ) (p1, p2, p3) (p1,p2,p3),从当前最小的数开始移动指针,以期更接近最小距离。具体思路:

  1. 初始化三个指针 ( p 1 , p 2 , p 3 ) (p1, p2, p3) (p1,p2,p3) 分别指向 ( a , b , c ) (a, b, c) (a,b,c) 的开头。
  2. 在每次迭代中计算 ( D ( a [ p 1 ] , b [ p 2 ] , c [ p 3 ] ) ) (D(a[p1], b[p2], c[p3])) (D(a[p1],b[p2],c[p3])) 并更新最小值。
  3. 在保证升序的前提下,移动当前最小值所在集合的指针。

代码实现:

#include <iostream>
#include <vector>
#include <climits>
#include <cmath>
using namespace std;vector<int> find(vector<int> a, vector<int> b, vector<int> c) {int minValue = INT_MAX;vector<int> ans;int q = 0, w = 0, r = 0;while(q < a.size() && w < b.size() && r < c.size()) {int t = abs(a[q] - b[w]) + abs(b[w] - c[r]) + abs(c[r] - a[q]);if (t < minValue) {ans = {a[q], b[w], c[r]};minValue = t;}if(a[q] < b[w] && a[q] <= c[r]) q++;else if(b[w] < c[r] && b[w] <= a[q]) w++;else r++;}return ans;
}

算法复杂度分析

  1. 暴力法: 复杂度为 ( O ( n 3 ) ) (O(n^3)) (O(n3)),其中 ( n ) (n) (n) 为每个集合的元素数。适用于集合元素较少的情况,但当集合规模较大时,性能较差。
  2. 双指针法: 复杂度为 O ( n ) O(n) O(n)。由于每次迭代移动一个指针,整体效率更高。

结论

在元素数较少时,暴力法简单直接;对于较大集合,应优先考虑双指针法来降低时间复杂度。此类算法思路在寻找多集合最小距离问题中广泛适用。

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

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

相关文章

基于SpringBoot的“CSGO赛事管理系统”的设计与实现(源码+数据库+文档+PPT)

基于SpringBoot的“CSGO赛事管理系统”的设计与实现&#xff08;源码数据库文档PPT) 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringBoot 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 系统首页界面图 赛事信息界面图 赛事通知界面…

阿里云VPC机器如何访问公网

1.创建专有网络和交换机。 2.在弹性公网IP页面&#xff0c;创建弹性公网IP&#xff0c;详情请参见申请EIP。 3.在公网NAT网关页面&#xff0c;创建NAT网关&#xff0c;并绑定弹性公网IP&#xff0c; 参考&#xff1a; https://help.aliyun.com/zh/nat-gateway/getting-starte…

【QT】windows 平台 QT6.8 安装

qt-online-installer-windows-x64-4.8.1.exe Index of /qt/archive/online_installers/4.8/mirror 这里介绍了如何使用mir

CesiumJS 案例 P13:删除标记、移动标记、标记点击事件

CesiumJS CesiumJS API&#xff1a;https://cesium.com/learn/cesiumjs/ref-doc/index.html CesiumJS 是一个开源的 JavaScript 库&#xff0c;它用于在网页中创建和控制 3D 地球仪&#xff08;地图&#xff09; 一、删除标记 <!DOCTYPE html> <html lang"en&…

一七二、Vue3性能优化方式

Vue 3 的性能优化相较于 Vue 2 有了显著提升&#xff0c;利用新特性和改进方法可以更高效地构建和优化应用。以下是 Vue 3 的常见性能优化方法及示例。 1. 使用组合式 API (Composition API) Vue 3 引入的组合式 API&#xff0c;通过逻辑拆分和复用来实现更高效的代码组织和性…

漏洞挖掘 | 通过域混淆绕过实现账户接管

由于这是一个私有项目&#xff0c;我将使用 example.com 来代替。 很长一段时间以来&#xff0c;我一直想在漏洞赏金项目中找到一个账户接管&#xff08;ATO&#xff09;漏洞。于是&#xff0c;我开始探索项目范围内的 account.example.com。 我做的第一件事就是注册一个新账…

Rust 基础语法与常用特性

Rust 跨界&#xff1a;全面掌握跨平台应用开发 第一章&#xff1a;快速上手 Rust 1.2 基础语法与常用特性 1.2.1 数据类型与控制流 数据类型 Rust 提供了丰富的内置数据类型&#xff0c;主要分为标量类型和复合类型。 标量类型 标量类型表示单一的值&#xff0c;Rust 中…

【linux】centos编译安装openssl1.1.1

文章目录 背景用途编译安装openssl1.1.1d测试centos的python2 ssl模块是否正常pyenv编译python3.10需要配置环境变量(必须)编译python前记得安装依赖 背景 首先&#xff0c; centos7 通过yum安装的openssl-devel包是1.0.2k的&#xff0c;这玩意儿太老了。我们选择从源码安装op…

视觉目标检测标注xml格式文件解析可视化 - python 实现

视觉目标检测任务&#xff0c;通常用 labelimage标注&#xff0c;对应的标注文件为xml。 该示例来源于开源项目&#xff1a;https://gitcode.com/DataBall/DataBall-detections-100s/overview 读取 xml 标注文件&#xff0c;并进行可视化示例如下&#xff1a; #-*-coding:ut…

E卷-空栈压数

题目描述 向一个空栈压入正整数&#xff0c;每当压入一个整数时&#xff0c;执行以下规则(设:栈顶至栈底整数依次为 n 1 , n 2 , . . . n x n1,n2,... nx n1,n2,...nx&#xff0c;其中 n 1 n1 n1 为最新压入的整数)。 如果 n 1 n 2 n1 n2 n1n2&#xff0c;则 n 1 , n 2…

地理征服营销与开源 AI 智能名片 2 + 1 链动模式 S2B2C 商城小程序的融合创新

摘要&#xff1a;本文探讨了地理征服营销这一创新营销策略与开源 AI 智能名片 2 1 链动模式 S2B2C 商城小程序的融合应用。首先阐述地理征服营销的概念和实施要点&#xff0c;接着介绍开源 AI 智能名片 2 1 链动模式 S2B2C 商城小程序的功能与优势&#xff0c;分析二者结合如…

三周精通FastAPI:24 OAuth2 实现简单的 Password 和 Bearer 验证

官网文档&#xff1a;https://fastapi.tiangolo.com/zh/tutorial/security/simple-oauth2/ OAuth2 实现简单的 Password 和 Bearer 验证 本章添加上一章示例中欠缺的部分&#xff0c;实现完整的安全流。 获取 username 和 password 首先&#xff0c;使用 FastAPI 安全工具获…

字节青训-兔群繁殖之谜

问题描述 生物学家小 R 正在研究一种特殊的兔子品种的繁殖模式。这种兔子的繁殖遵循以下规律&#xff1a; 每对成年兔子每个月会生育一对新的小兔子&#xff08;一雌一雄&#xff09;。新生的小兔子需要一个月成长&#xff0c;到第二个月才能开始繁殖。兔子永远不会死亡。 小 R…

appium自动化对已打开的app操作

一、说明 由于 Appium 4.x 版本对会话的管理方式发生了变化&#xff0c;直接重用会话的功能可能不再支持。你可能需要调整测试策略&#xff0c;采用新的方法与已经打开的应用进行交互&#xff0c;比如使用 ADB&#xff0c;就为了找这个我找了很久网上都没有说明&#xff0c;老…

基于STM32的智能厨房油烟监测与排风系统设计

引言 在日常烹饪过程中&#xff0c;厨房中容易产生大量油烟&#xff0c;长时间积累会对空气质量和墙面产生不良影响&#xff0c;甚至危害人体健康。智能厨房油烟监测与排风系统可以实时监测厨房内的油烟浓度&#xff0c;自动调节排风扇运行&#xff0c;确保空气清新。本文设计…

MiniWord

1.nuget 下载配置 2.引用 3. var value = new Dictionary<string, object>() { ["nianfen"] = nianfen, ["yuefen"] = yuefen, ["yuefenjian1"] = (int.Par…

计算机毕业设计Python+大模型恶意木马流量检测与分类 恶意流量监测 随机森林模型 深度学习 机器学习 数据可视化 大数据毕业设计 信息安全 网络安全

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; Python大模型恶意木马流量检…

04.DDD与CQRS

学习视频来源&#xff1a;DDD独家秘籍视频合集 https://space.bilibili.com/24690212/channel/collectiondetail?sid1940048&ctype0 文章目录 定义职责分离DDD与CQRS的关系领域模型和查询模型特点命令场景的领域模型查询场景的查询模型 架构方案领域事件方案1&#xff1a…

专业140+总分410+武汉大学807信号与系统考研经验武大原936电子信息与通信工程,真题,大纲,参考书。

考研专业课807信号与系统(原936)140&#xff0c;总分410&#xff0c;顺利被武汉大学录取&#xff0c;群 里不少同学希望总结一下复习经验&#xff0c;回看这一年有得有失&#xff0c;总结一下希望给大家有些参考。考研还需从自身情况出发&#xff0c;制定适合自己的复习计划&am…

Java 定时任务详解

在 Java 应用开发中&#xff0c;定时任务是一项非常常见且重要的功能。它允许我们在特定的时间间隔或特定的时间点执行预先定义好的任务&#xff0c;比如定时备份数据、定时清理缓存、定时发送邮件等。本文将参考javaguide对 Java 定时任务进行详细的讲解。 一、Java 中实现定…