Leetcode.2359 找到离给定两个节点最近的节点

news2024/11/26 5:57:29

题目链接

Leetcode.2359 找到离给定两个节点最近的节点 Rating : 1715

题目描述

给你一个 n个节点的 有向图 ,节点编号为 0n - 1,每个节点 至多 有一条出边。

有向图用大小为 n下标从 0开始的数组 edges表示,表示节点 i有一条有向边指向 edges[i]。如果节点 i没有出边,那么 edges[i] == -1

同时给你两个节点 node1node2

请你返回一个从 node1node2都能到达节点的编号,使节点 node1和节点 node2到这个节点的距离 较大值最小化。如果有多个答案,请返回 最小 的节点编号。如果答案不存在,返回 -1

注意 edges可能包含环。

示例1:

在这里插入图片描述

输入:edges = [2,2,3,-1], node1 = 0, node2 = 1
输出:2
解释:从节点 0 到节点 2 的距离为 1 ,从节点 1 到节点 2 的距离为 1 。
两个距离的较大值为 1 。我们无法得到一个比 1 更小的较大值,所以我们返回节点 2 。

示例2:

在这里插入图片描述

输入:edges = [1,2,-1], node1 = 0, node2 = 2
输出:2
解释:节点 0 到节点 2 的距离为 2 ,节点 2 到它自己的距离为 0 。
两个距离的较大值为 2 。我们无法得到一个比 2 更小的较大值,所以我们返回节点 2 。

提示:

  • n = = e d g e s . l e n g t h n == edges.length n==edges.length
  • 2 < = n < = 1 0 5 2 <= n <= 10^5 2<=n<=105
  • − 1 < = e d g e s [ i ] < n -1 <= edges[i] < n 1<=edges[i]<n
  • e d g e s [ i ] ! = i edges[i] != i edges[i]!=i
  • 0 < = n o d e 1 , n o d e 2 < n 0 <= node1, node2 < n 0<=node1,node2<n

解法一:BFS

一个比较容易想到的解法是,对于 node1node2分别通过 BFS 计算其 到各个点的距离矩阵 d1d2

对于 d1d2,我们从小到大遍历,更新最小的 较大值。

时间复杂度: O ( n ) O(n) O(n)

代码:

class Solution {
public:
// 建图
    unordered_map<int,vector<int>> g;
    
    //bfs 求起点 root 到各个点的距离矩阵
    void bfs(int root,vector<int> & dist){
        queue<int> q;
        q.push(root);

        int step = 0;
        while(!q.empty()){
            int sz = q.size();
            for(int i = 0;i < sz;i++){
                auto t = q.front();
                q.pop();
                dist[t] = step;

                for(auto v:g[t]){
                    if(dist[v] != -1) continue;
                    q.push(v);
                }
            }
            step++;
        }
    }

    int closestMeetingNode(vector<int>& edges, int node1, int node2) {
        int n = edges.size();
        for(int i = 0;i < n;i++){
            if(edges[i] == -1) continue;

            int a = i, b = edges[i];
            g[a].push_back(b);
        }
        

        vector<int> a(n,-1),b(n,-1);

        bfs(node1,a);
        bfs(node2,b);

        /*for(int i = 0;i < n;i++){
            printf("i = %d , d1 = %d , d2 = %d\n",i,a[i],b[i]);
        }*/

        int dist = 1e9;
        int idx = -1;

        for(int i = 0;i < n;i++){
            if(a[i] == -1 || b[i] == -1) continue;
            int d = max(a[i],b[i]);
            if(dist > d){
                dist = d;
                idx = i;
            }
        }

        return idx;
    }
};

解法二:遍历

题目给定地有向图实际上是一个 基环树,因为每一个结点的 出边最多只有一条,所以实际上我们不需要建图,只需要直接循环遍历即可。

时间复杂度: O ( n ) O(n) O(n)

代码:

class Solution {
public:
    int closestMeetingNode(vector<int>& edges, int node1, int node2) {
        int n = edges.size();

        auto dfs = [&](int u) -> vector<int>{
            vector<int> dist(n,1e9);
            int d = 0;

            while(u != -1 && dist[u] == 1e9){
                dist[u] = d;
                d++;
                u = edges[u];
            }

            return dist;
        };

        auto d1 = dfs(node1);
        auto d2 = dfs(node2);

        int ans = 1e9,idx = -1;
        for(int i = 0;i < n;i++){
            if(d1[i] == 1e9 || d2[i] == 1e9) continue;
            int d = max(d1[i],d2[i]);
            if(ans > d){
                ans = d;
                idx = i;
            }
        }
        return idx;
    }
};

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

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

相关文章

数字档案室测评的些许感悟

我是甲方&#xff0c;明明我家是档案“室”&#xff0c;为什么申请的是数字档案“馆”&#xff1f; 笔者正对着手里的一份方案苦笑&#xff0c;甲方爸爸是某机关单位档案室&#xff0c;方案最后的附件赫然写着几个大字&#xff1a;“申请国家级数字档案馆……“。这样的事屡见…

SpringMVC再学习

基于原生的Servlet&#xff0c;通过了功能强大的前端控制器DispatcherServlet&#xff0c;对请求和相应进行统一处理 如今我们不再去web.xml中去主持servlet 而是直接创建一个配置类ServletContainersInitConfig去基础AbstractDispatcherServletInitializer createServletApp…

高性能 WPF 图表控件LightningChart.NET:支持从 Web 服务器获取数据 | 附最新版试用下载

LightningChart.NET 是一款高性能 WPF 和 Winforms 图表,可以实时可视化多达1万亿个数据点。可有效利用CPU和内存资源&#xff0c;实时监控数据流。同时&#xff0c;LightningChart使用突破性创新技术&#xff0c;以实时优化为前提&#xff0c;大大提升了实时渲染的效率和效果&…

Python的面向对象,详细讲解Python之用处等基本常识

目录 Python 面向对象 面向对象技术简介 创建类 实例 实例 self代表类的实例&#xff0c;而非类 实例 创建实例对象 访问属性 实例 Python内置类属性 实例 python对象销毁(垃圾回收) 实例 实例 类的继承 实例 方法重写 实例 基础重载方法 运算符重载 实例…

机器学习: 可视化反卷积操作

转置卷积操作的详细分解 1. 简介 转置卷积是用于生成图像的&#xff0c;尽管它们已经存在了一段时间&#xff0c;并且得到了很好的解释——我仍然很难理解它们究竟是如何完成工作的。我分享的文章[1]描述了一个简单的实验来说明这个过程。我还介绍了一些有助于提高网络性能的技…

yolov5的基本配置

yolov5的基本配置train.pydata.yaml数据集标签文件格式:总结train.py def parse_opt(knownFalse):parser argparse.ArgumentParser()parser.add_argument(--weights, typestr, defaultROOT / yolov5s.pt, helpinitial weights path)parser.add_argument(--cfg, typestr, defau…

【Java面试篇】Spring中@Transactional注解事务失效的常见场景

文章目录Transactional注解的失效场景☁️前言&#x1f340;前置知识&#x1f341;场景一&#xff1a;Transactional应用在非 public 修饰的方法上&#x1f341;场景二&#xff1a; propagation 属性设置错误&#x1f341;场景三&#xff1a;rollbackFor属性设置错误&#x1f3…

Apache druid未授权命令执行漏洞复现

简介 Apache Druid是一个实时分析型数据库&#xff0c;旨在对大型数据集进行快速的查询分析&#xff08;"OLAP"查询)。Druid最常被当做数据库来用以支持实时摄取、高性能查询和高稳定运行的应用场景&#xff0c;同时&#xff0c;Druid也通常被用来助力分析型应用的图…

【蓝桥杯嵌入式】拓展板之数码管显示

文章目录硬件电路连接方式函数实现文章福利硬件电路 通过上述原理图&#xff0c;可知拓展板上的数码管是一个共阴数码管&#xff0c;也就是说某段数码管接上高电平时&#xff0c;就会点亮。   上述原理图还给出一个提示&#xff0c;即&#xff1a;三个数码管分别与三个74HC59…

十八、Django-restframework之请求和响应(三)

1. 请求对象 REST框架引入了一个扩展了常规HttpRequest的请求对象&#xff0c; 并提供更灵活的请求解析。请求对象的核心功能是属性request.data&#xff0c;这与request.POST类似&#xff0c;但对于WebAPIs更有用。 request.POST # Only handles form data. Only works fo…

Barra模型因子的构建及应用系列五之NonLinear Size因子

一、摘要 在前期的Barra模型系列文章中&#xff0c;我们构建了Size因子、Beta因子、Momentum因子和Residual Volatility因子&#xff0c;并分别创建了对应的单因子策略&#xff0c;本节文章在该系列下进一步构建NonLinear Size因子。从回测结果看&#xff0c;自2022年以来&…

ConcurrentHashMap-Java八股面试(五)

系列文章目录 第一章 ArrayList-Java八股面试(一) 第二章 HashMap-Java八股面试(二) 第三章 单例模式-Java八股面试(三) 第四章 线程池和Volatile关键字-Java八股面试(四) 提示&#xff1a;动态每日更新算法题&#xff0c;想要学习的可以关注一下 文章目录系列文章目录一、…

基于卷积神经网络CNN的三相故障识别

目录 背影 卷积神经网络CNN的原理 卷积神经网络CNN的定义 卷积神经网络CNN的神经元 卷积神经网络CNN的激活函数 卷积神经网络CNN的传递函数 卷积神经网络CNN手写体识别 基本结构 主要参数 MATALB代码 结果图 展望 背影 现在生活&#xff0c;为节能减排&#xff0c;减少电能损…

Ajax学习 基础概念 发送请求 常见方法

AJAX 简介 AJAX 全称为Asynchronous Javascript And XML &#xff0c;就是异步的JS和XML。 通过AJAX可以再浏览器中向服务器发送异步请求&#xff0c;最大的优势&#xff1a;无刷新获取数据。 AJAX 不是新的编程语言&#xff0c;而是一种将现有的标准组合在一起使用的新方式。…

从FPGA说起的深度学习(四)

这是新的系列教程&#xff0c;在本教程中&#xff0c;我们将介绍使用 FPGA 实现深度学习的技术&#xff0c;深度学习是近年来人工智能领域的热门话题。在本教程中&#xff0c;旨在加深对深度学习和 FPGA 的理解。用 C/C 编写深度学习推理代码高级综合 (HLS) 将 C/C 代码转换为硬…

锚点定位使内容在指定区域显示

1、问题描述 在使用锚点定位时&#xff0c;使用 scrollIntoView 方法&#xff0c;导致整个页面随着锚点跳转 2、问题分析 因为最开始做需求的时候&#xff0c;只在最外层设置了一个滚动条&#xff0c;所以导致整体锚点的跳转是随着最外层滚动条距离顶部的高度跳转的&#xf…

从NLP视角看电视剧《狂飙》,会有什么发现?

文章目录1、背景2、数据获取3、文本分析与可视化3.1 短评数据预处理3.2 词云图可视化3.3 top关键词共现矩阵网络3.4 《狂飙》演职员图谱构建4、短评相关数据分析与可视化5、总结原文请关注&#xff1a;实用自然语言处理 作者&#xff1a;风兮 建议查看原文&#xff1a; https…

Linux下软件部署安装管理----rpmbuild打包rpm包部署安装

来源&#xff1a;微信公众号「编程学习基地」 文章目录1.安装rpmbuild2.rpm包制作打包rpm包3.rpm包安装4.rpm包卸载1.安装rpmbuild yum install rpmbuild yum install rpmdevtools创建rpm包管理路径&#xff0c;生成rpm相关目录 RPM打包的时候需要编译源码&#xff0c;还需要…

基于Cortex-M7内核STM32F767NIH6,STM32F767VGT6,STM32F767VIT6嵌入式技术资料

STM32F7 32 位 MCUFPU 基于高性能的 ARMCortex-M7 32 位 RISC 内核&#xff0c;工作频率高达 216MHz。Cortex-M7 内核具有单浮点单元(SFPU)精度&#xff0c;支持所有 ARM 单精度数据处理指令与数据类型。同时执行全套 DSP 指令和存储保护单元&#xff08;MPU&#xff09;&#…

【完美解决】应用程序无法正常启动(0xc000007b)请单击“确定”关闭应用程序

年期安装CorelDRAW X8 (64-Bit)&#xff0c;安装完成之后运行一点毛病都没有&#xff0c;可是过了两三个月&#xff0c;再打开就出现“应用程序无法正常启动(0xc000007b)请单击“确定”关闭应用程序”这个提示框&#xff0c;如下图示 出现这个问题我就上网查找&#xff0c;无非…