学习记录:js算法(一百一十八):连接所有点的最小费用

文章目录

    • 连接所有点的最小费用
      • 思路一

连接所有点的最小费用

给你一个points 数组,表示 2D 平面上的一些点,其中 points[i] = [xi, yi] 。
连接点 [xi, yi] 和点 [xj, yj] 的费用为它们之间的 曼哈顿距离 :|xi - xj| + |yi - yj| ,其中 |val| 表示 val 的绝对值。
请你返回将所有点连接的最小总费用。只有任意两点之间 有且仅有 一条简单路径时,才认为所有点都已连接。

图一:
在这里插入图片描述

图二:
在这里插入图片描述

示例 1:图一
输入:points = [[0,0],[2,2],[3,10],[5,2],[7,0]]
输出:20
解释:图二
我们可以按照上图所示连接所有点得到最小总费用,总费用为 20 。
注意到任意两个点之间只有唯一一条路径互相到达。示例 2:
输入:points = [[3,12],[-2,5],[-4,1]]
输出:18示例 3:
输入:points = [[0,0],[1,1],[1,0],[-1,1]]
输出:4示例 4:
输入:points = [[-1000000,-1000000],[1000000,1000000]]
输出:4000000示例 5:
输入:points = [[0,0]]
输出:0

思路一

function minCostConnectPoints(points) {const edges = [];const parents = new Array(points.length);let cost = 0;// 初始化并查集for (let i = 0; i < points.length; i++) {parents[i] = i;}// 计算所有边的权重for (let i = 0; i < points.length; i++) {for (let j = i + 1; j < points.length; j++) {const weight = Math.abs(points[i][0] - points[j][0]) + Math.abs(points[i][1] - points[j][1]);edges.push([i, j, weight]);}}// 排序边的权重edges.sort((a, b) => a[2] - b[2]);// 查找并查集的根节点function find(node) {if (parents[node] !== node) {parents[node] = find(parents[node]);}return parents[node];}// 合并两个集合function union(x, y) {const rootX = find(x);const rootY = find(y);if (rootX !== rootY) {parents[rootX] = rootY;return true;}return false;}// Kruskal算法构建MSTfor (const [u, v, w] of edges) {if (union(u, v)) {cost += w;}}return cost;
}

讲解
这个问题可以看作是一个经典的最小生成树(Minimum Spanning Tree,MST)问题,但与传统的基于边权重的MST问题略有不同,因为边的权重(即曼哈顿距离)需要在运行时计算。为了解决这个问题,我们可以采用Prim算法或Kruskal算法,这里我们选择使用Kruskal算法,因为它不需要维护一个复杂的优先级队列,更适合于解决这种动态计算边权重的问题。

  1. 计算所有边的权重:遍历所有点对,计算它们之间的曼哈顿距离,并将这些边及其权重存储在一个数组中。
  2. 排序边的权重:将所有的边按照权重从小到大排序。
  3. Kruskal算法构建MST:
    ○ 使用并查集(Disjoint Set Union,DSU)数据结构来跟踪哪些顶点已经被包含在MST中,以及哪些顶点还处于分离状态。
    ○ 依次考虑排序后的每条边,如果这条边连接的两个顶点目前还没有在同一个集合中(即它们还没有被连接在一起),就将这条边添加到MST中,并将这两个顶点合并到同一个集合中。
  4. 返回MST的总权重:当所有点都被包含在MST中时,累加所有被选中的边的权重,即为最小总费用。

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

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

相关文章

Java项目实战II基于微信小程序的小区租拼车管理信息系统 (开发文档+数据库+源码)

目录 一、前言 二、技术介绍 三、系统实现 四、核心代码 五、源码获取 全栈码农以及毕业设计实战开发&#xff0c;CSDN平台Java领域新星创作者&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导。 一、前言 随着城市化进程的加速&#xff0c;小区居民对于出行方…

数据结构与算法之美:单链表

Hello大家好&#xff01;很高兴我们又见面啦&#xff01;给生活添点passion&#xff0c;开始今天的编程之路&#xff01; 我的博客&#xff1a;<但凡. 我的专栏&#xff1a;《数据结构与算法之美》、《编程之路》、《题海拾贝》 欢迎点赞&#xff0c;关注&#xff01; 目录 …

样品前处理工作站自动化操作

样品前处理工作站通过集成多种技术和自动化模块&#xff0c;实现了对样品的高效、精准处理。以下是实现自动化操作的关键步骤和原理&#xff1a; 1、集成多种技术&#xff1a;工作站通常集成了液体处理、固相萃取、离心、过滤等多种技术。这些技术的结合使得工作站能够完成从样…

redis安装和使用教程【保姆级】

1.下载 通过网盘分享的文件&#xff1a;redis 链接: https://pan.baidu.com/s/1Tu1KZkf33YJFdul8s6SzqQ?pwd8888 提取码: 8888 2.启动 进入根目录&#xff0c;使用redis-server redis.windows.conf命令启行启动Redis服务&#xff0c; 如下图所示为启动成功&#xff0c;默认…

RabbitMq 基础

文章目录 一、初识 MQ1.1 同步调用&#xff1a;1.2 异步调用&#xff1a; 二、RabbitMQ三、SpringAMQP3.1 依赖和配置文件3.2 消息发送和接收&#xff1a;3.2.1 消息发送&#xff1a;3.2.2 消息接收&#xff1a; 3.3 WorkQueues 模型&#xff1a;3.4 交换机类型&#xff1a;3.4…

建筑行业数据分析如何做?

导读&#xff1a;在谈数字化转型之前&#xff0c;先来谈谈数据的价值。数字化转型的基础是数据&#xff0c;是数字化的基本的生产资料&#xff0c;数据的质量直接决定了数字化的能力、所能达到的深度和广度。目前做的数据可视化项目总感觉只是数据展现而已&#xff0c;而不达不…

电脑投屏到电脑:Windows,macOS及Linux系统可以相互投屏!

本篇其实是电脑远程投屏到另一台电脑的操作介绍。本篇文章的方法可用于Windows&#xff0c;macOS及Linux系统的相互投屏。 为了避免介绍过程中出现“这台电脑”投屏到“那台电脑”的混乱表述&#xff0c;假定当前屏幕投出端是Windows系统电脑&#xff0c;屏幕接收端是Linux系统…

随时随地掌控数据:如何使用手机APP远程访问飞牛云NAS

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

2024-12-04OpenCV视频处理基础

OpenCV视频处理基础 OpenCV的视频教学&#xff1a;https://www.bilibili.com/video/BV14P411D7MH 1-OpenCV视频捕获 在 OpenCV 中&#xff0c;cv2.VideoCapture() 是一个用于捕获视频流的类。它可以用来从摄像头捕获实时视频&#xff0c;或者从视频文件中读取帧。以下是如何使用…

ubuntu安装navicat,并使用navicat连接mysql服务

1.安装宝塔&#xff1a; 登录宝塔官网&#xff1a;https://www.bt.cn/new/download.html 使用对应命令安装宝塔&#xff0c;然后搭建mysql环境。 2.安装navicat 有需要教程的私我&#xff0c;我再更新整理出来 &#xff01;&#xff01;&#xff01; 有需要教程的私我&#xf…

深度学习:MindSpore自动并行

随着模型规模的逐渐增大&#xff0c;需要的算力逐渐增强&#xff0c;但是算力需求增长速度远高于芯片算力增长速度。现在唯一的解决方案只有通过超大规模集群训练大模型。 大集群训练大模型的挑战 内存墙 200B参数量的模型&#xff0c;参数内存占用745GB内存&#xff0c;训练…

Qt Designer Ui设计 功能增加

效果展示 输入密码&#xff0c;密码错误&#xff0c;弹出提示 密码正确&#xff0c;弹出提示并且关闭原窗口 代码&#xff08;只提供重要关键主代码&#xff09;lxh_log.py代码&#xff1a; import sysfrom PySide6.QtWidgets import QApplication, QWidget, QPushButtonfrom …

版本控制器git

版本控制git 什么是版本控制&#xff1f; 版本控制是一种跟踪管理文件变化的技术&#xff0c;特别是软件源码的修改、更新、和历史记录。当程序员想要进行用到之前版本的代码可以进行查看、协作、并编辑文件。 举个栗子 当一位初入职场的萌新程序员在进行执行产品经理的需求时…

jetbrain 插件开发初体验

idea插件开发初体验 背景 标准化的git commit Message很重要&#xff0c;一直以来我用的都是commit-template-idea-plugin&#xff0c;他提供的模板遵循了conventionalcommits规范 <type>(<scope>): <subject> <BLANK LINE> <body> <BLANK…

解决raw.githubusercontent.com无法访问的问题

显示报错&#xff1a;ConnectionError: Couldn’t reach https://raw.githubusercontent.com/huggingfac 无法访问 在https://www.ipaddress.com 或者ip138.com网站中的查询框中输入&#xff1a;raw.githubusercontent.com 回车就能有下图中的网页&#xff0c;在里面找到相应的…

高效职场人

文章目录 1.时间效能 ABCD2.高效员工的习惯之 自我掌控的秘诀3.学会做主4.学会互赢5.学会沟通、学会聆听6.学会可持续发展&#xff1a;四个方面更新自我(1)更新身体(2)更新精神(3)更新智力(4)更新人际情感 1.时间效能 ABCD 时间四象限&#xff1a; A类任务&#xff1a;重要且紧…

数据结构 (33)选择类排序

前言 数据结构中的选择类排序主要包括简单选择排序&#xff08;也称为选择排序&#xff09;和堆排序。 一、简单选择排序 基本思想&#xff1a;简单选择排序是一种直观易懂的排序算法。它的工作原理是&#xff0c;在未排序序列中找到最小&#xff08;或最大&#xff09;元素&am…

Kubernetes架构原则和对象设计(二)

云原生学习路线导航页&#xff08;持续更新中&#xff09; kubernetes学习系列快捷链接 Kubernetes架构原则和对象设计&#xff08;一&#xff09;Kubernetes常见问题解答 本文从云计算架构发展入手&#xff0c;详细分析了kubernetes的生态系统、设计理念、分层架构、API设计…

自建服务器,数据安全有保障

在远程桌面工具的选择上&#xff0c;向日葵和TeamViewer功能强大&#xff0c;但都存在收费昂贵、依赖第三方服务器、数据隐私难以完全掌控等问题。相比之下&#xff0c;RustDesk 凭借开源免费、自建服务的特性脱颖而出&#xff01;用户可以在自己的服务器上部署RustDesk服务端&…

发布Apache2.4** 局域网无法访问

1。 防火墙关闭 或者 设置入站规则 2&#xff0c;查看httpd.conf 文件 设置配置 原 Listen 80 修改成 Listen 192.168.31.127:90 3.确保 本地IP 是否正确