力扣--并查集1631.最小体力消耗路径

news2024/11/19 1:33:37

这题将图论和并查集联系起来。把数组每个位置看成图中的一个节点。

这段代码的主要思路是:

  1. 遍历地图中的每个节点,将每个节点与其相邻的下方节点和右方节点之间的边加入到边集合中(因为从上到下和从下到上他们高度绝对值一样的,所以只要考虑下方和右方)。
  2. 对所有的边按照其权重(高度差绝对值)进行升序排序。
  3. 遍历排序后的边集合,依次将每条边所连接的节点合并到一个集合中,并检查左上角节点和右下角节点是否已经连通。
  4. 当左上角节点和右下角节点连通时,返回当前边的权重,即为最小体力消耗值。
class Solution {
    int all; // 所有节点的数量
    int n, m; // 地图的行数和列数
    int fa[100001]; // 并查集数组,用于记录每个节点的父节点

    // 并查集的查找操作,寻找根节点
    int find(int x) {
        if (fa[x] == x)
            return x;
        else 
            return find(fa[x]);
    }

    // 并查集的合并操作,将两个节点所在的集合合并
    void togother(int x, int y) {
        fa[find(x)] = find(y);
    }

    // 边的结构体,用于表示两个节点之间的边以及边的权重
    typedef struct edge {
        int u; // 边的起始节点
        int v; // 边的结束节点
        int weight; // 边的权重(高度差绝对值)
    } edge;

    // 将二维坐标转换为一维索引
    int getIndex(int i, int j) {
        return i * m + j;
    }
    
    // 静态比较函数,用于排序边,按照权重升序排序
    static bool cmp(const edge &x1, const edge &x2) {
        return x1.weight < x2.weight;
    }

public:
    int minimumEffortPath(std::vector<std::vector<int>>& heights) {
        n = heights.size(); // 获取地图的行数
        m = heights[0].size(); // 获取地图的列数
        all = n * m; // 计算地图中格子的总数

        // 初始化并查集,每个节点的父节点初始为自身
        for (int i = 0; i < all; i++)
            fa[i] = i;

        vector<edge> edges; // 存储所有可能的边

        // 遍历地图上的每个节点,构建边
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                int idx1 = getIndex(i, j); // 当前节点的索引

                // 计算当前节点与下方节点的边
                if (i + 1 < n)
                    edges.push_back({idx1, getIndex(i + 1, j), abs(heights[i][j] - heights[i + 1][j])});

                // 计算当前节点与右方节点的边
                if (j + 1 < m)
                    edges.push_back({idx1, getIndex(i, j + 1), abs(heights[i][j] - heights[i][j + 1])});
            }
        }

        // 按照边的权重进行升序排序
        sort(edges.begin(), edges.end(), cmp);

        // 遍历所有的边
        for (int i = 0; i < edges.size(); i++) {
            // 将当前边所连接的两个节点合并到同一个集合中
            togother(edges[i].u, edges[i].v);

            // 如果起始节点和终止节点在同一个集合中,即左上角节点和右下角节点连通
            if (find(0) == find(getIndex(n - 1, m - 1)))
                return edges[i].weight; // 返回当前边的权重,即最小体力消耗值
        }

        return 0; // 默认情况下返回0,表示没有路径
    }
};

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

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

相关文章

文件IO的方式读取jpeg图片的分辨率

1、读取jpeg图片分辨率的两种方式 1.1 使用libjpeg库 可以使用libjpeg库读取JPEG图像文件&#xff0c;并获取图像的分辨率&#xff08;宽度和高度&#xff09;&#xff0c;简单demo示例如下&#xff1a; #include <stdio.h> #include <jpeglib.h>int main() {st…

6、ChatGLM3-6B 部署实践

一、ChatGLM3-6B介绍与快速入门 ChatGLM3 是智谱AI和清华大学 KEG 实验室在2023年10月27日联合发布的新一代对话预训练模型。ChatGLM3-6B 是 ChatGLM3 系列中的开源模型&#xff0c;免费下载&#xff0c;免费的商业化使用。 该模型在保留了前两代模型对话流畅、部署门槛低等众多…

GPT2从放弃到入门(四)

引言 体验地址&#xff1a;https://huggingface.co/spaces/greyfoss/gpt2-chatbot 上篇文章我们通过Gradio作为前端轻松地连接到训练好的Chatbot&#xff0c;本文介绍如何分享你创建好的模型给你的朋友。 当你训练好的模型推送到Huggingface Hub上后&#xff0c;其实还可以进一…

How to convert .py to .ipynb in Ubuntu 22.04

How to convert .py to .ipynb in Ubuntu 22.04 jupyter nbconvertp2j 最近看到大家在用jupyter notebook&#xff0c;我也试了一下&#xff0c;感觉还不错&#xff0c;不过&#xff0c;也遇到了一些问题&#xff0c;比方说&#xff0c;我有堆的.py文件&#xff0c;如果要一个一…

YOLOv8融入低照度图像增强算法---传统算法篇

YOLOv8n原图检测YOLOv8n增强后检测召回率和置信度都有提升 前言 这篇博客讲讲低照度,大家都催我出一些内容,没想到这么多同学搞这个,恰好我也做过这方面的一些工作,那今天就来讲解一些方法,低照度的图像增强大体分“传统算法”和“深度学习算法”; 目前低照度的图像增…

sqlite3嵌入式开发板命令行方式使用

如何在编译嵌入式版本的sqlite3&#xff0c;请看我上一篇文章 sqlite3 交叉编译-CSDN博客 一、sqlite3命令行方式使用 假如我将编译好的嵌入式的sqlite3放置在如下路径&#xff1a; 进入bin目录进行操作 1.运行sqlite3 运行sqlite3有两种方式 1&#xff09;直接在内存里面…

Wireshark使用相关

1.wireshark如何查看RST包 tcp.flags.reset1 RST表示复位&#xff0c;用来异常的关闭连接&#xff0c;在TCP的设计中它是不可或缺的。发送RST包关闭连接时&#xff0c;不必等缓冲区的包都发出去&#xff08;不像上面的FIN包&#xff09;&#xff0c;直接就丢弃缓存区的包发送R…

Fastgpt 无法启动或启动后无法正常使用的讨论(启动失败、用户未注册等问题这里)

FastGPT 是一个基于 LLM 大语言模型的知识库问答系统&#xff0c;提供开箱即用的数据处理、模型调用等能力。同时可以通过 Flow 可视化进行工作流编排&#xff0c;从而实现复杂的问答场景&#xff01; FastGPT是非常实用并且相当厉害的个人知识库AI项目&#xff0c;项目是非常…

【Ubuntu】文件和目录的增、删、改、查操作

这里写目录标题 (一)文件和目录类命令的使用1、目录与文件的增加&#xff08;1&#xff09;目录的增加 :&#xff08;2&#xff09;文件的增加 2、目录与文件的删除&#xff08;1&#xff09;目录和文件的删除 3、目录与文件的修改&#xff08;1&#xff09;mv命令 4、目录与文…

数字孪生在教学培训的应用场景

数字孪生技术在教学培训领域的应用场景非常广泛&#xff0c;它通过创建一个真实世界的虚拟副本&#xff0c;为教育和培训提供了全新的方法和手段。以下是一些具体的应用场景&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#…

景顺长城:《重塑与创造——2024 ai+洞察报告》

近期&#xff0c;景顺长城发布了《重塑与创造——2024 ai洞察报告》,报告深入探讨了人工智能&#xff08;AI&#xff09;产业的发展现状、未来趋势以及对各行业的潜在影响。报告认为&#xff0c;AI产业发展是多层次、多浪潮的&#xff0c;目前我们处于第二阶段但未来将持续伴随…

Kibana的安装(Linux版)

Kibana是一个针对Elasticsearch的开源分析及可视化平台&#xff0c;用来搜索、查看交互存储在Elasticsearch索引中的数据。使用Kibana&#xff0c;可以通过各种图表进行高级数据分析及展示。 Kibana让海量数据更容易理解。它操作简单&#xff0c;基于浏览器的用户界面可以快速创…

3-iperf3 使用什么工具可以检测网络带宽、延迟和数据包丢失率等网络性能参数呢?

(1)iperf3简介 1.iperf3简介 2.用途&#xff08;特点&#xff09; 3.下载iperf3地址 &#xff08;2&#xff09;实战 1.iperf3参数 &#xff08;1&#xff09;通用参数&#xff08;客户端和服务器端都是适用的&#xff09; &#xff08;2&#xff09;客户端参数 实验1&…

鸿蒙生态专访——对话华为HDE坚果

hi, 大家好, 我是徐小夕. 之前在趣谈前端和大家分享了很多前端工程化, 可视化和低代码的技术实践, 今天又到了《小夕朋友圈》专访时刻, 我会定期采访国内外优秀的开源作者, 独立开发者和创业者, 分享他们的学习成长经验和独立产品开发经验, 让更多热爱技术的小伙伴建立技术自信…

机器学习笔记(3)—多变量线性回归

多变量线性回归&#xff08;LinearRegression witMultiple Variables&#xff09; 前言多变量线性回归多维特征多变量梯度下降特征和多项式回归正规方程 Normal Equation正规方程及不可逆性&#xff08;选&#xff09; 代码实例and计算梯度下降法的一些实例 总结 前言 我们在前…

【C语言】预处理编译链接调试技巧详解

主页&#xff1a;醋溜马桶圈-CSDN博客 专栏&#xff1a;C语言_醋溜马桶圈的博客-CSDN博客 gitee&#xff1a;mnxcc (mnxcc) - Gitee.com 目录 1.预处理 1.1 预定义符号 1.2 #define 1.2.1 #define 定义标识符 1.2.2 #define 定义宏 1.2.3 #define 替换规则 1.2.4 #和## …

cleanmymac x试用期结束会扣费吗?

CleanMyMac X试用期结束后&#xff0c;如果您选择继续使用该应用程序&#xff0c;则需要购买许可证&#xff0c;否则可能会被扣费。为了避免不必要的扣费&#xff0c;建议您在试用期结束前做出决定&#xff0c;如果不打算继续使用&#xff0c;请及时删除该应用程序。 CleanMyMa…

前端html常用标签 笔记

一、基础 开始标签 结束标签 大部分是成对出现的标签&#xff0c;这个是空标签(/放在最后&#xff0c;/可以省掉) 缩进 向后Tab 、前向ShiftTab 红的就是元素属性 标签可以使内容有一些特殊的表现: 给body颜色后&#xff1a; h1 span(连起来) 标签&#xff1a; 标题h1 h2 h3 …

edga 0x800704cf错误码(同步失败)

edga 0x800704cf错误码(同步失败) 执行此操作需要 Internet。 你似乎没有连接到 Internet。请检查你的连接&#xff0c;然后再试一次。 0x800704cf 发送反馈 取消windows键R&#xff0c; 输入services.msc 进入本地服务管理&#xff0c; 重启 Microsoft Account Sign-in Assi…

力扣爆刷第105天之CodeTop100五连刷11-15

力扣爆刷第105天之CodeTop100五连刷11-15 文章目录 力扣爆刷第105天之CodeTop100五连刷11-15一、5. 最长回文子串二、33. 搜索旋转排序数组三、102. 二叉树的层序遍历四、200. 岛屿数量五、121. 买卖股票的最佳时机 一、5. 最长回文子串 题目链接&#xff1a;https://leetcode…