题目链接

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;}
};

Leetcode.2359 找到离给定两个节点最近的节点相关推荐

  1. C++ ,leetcode 43. 字符串相乘 给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式

    一.思路: 字符串逆序,然后遍历两个逆序后的字符串,然后对应的字符相乘,i+j等于它的位数. string multiply(string num1, string num2) {reverseStr ...

  2. 2022-05-22:给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p

    2022-05-22:给定一个二叉树, 找到该树中两个指定节点的最近公共祖先. 百度百科中最近公共祖先的定义为:"对于有根树 T 的两个节点 p.q,最近公共祖先表示为一个节点 x,满足 x ...

  3. 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先

    给定一个二叉树, 找到该树中两个指定节点的最近公共祖先 三种情况: 1).如果左边为空,右边不为空,则右边的第一个节点就为公共祖先 2).如果右边为空,左边不为空,则左边的第一个节点就为公共祖先 3) ...

  4. 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。

    百度百科中最近公共祖先的定义为:"对于有根树 T 的两个结点 p.q,最近公共祖先表示为一个结点 x,满足 x 是 p.q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先).&q ...

  5. Java 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先

    代码中的二叉树长这个样子↓↓↓ 找到该树中两个指定节点的最近公共祖先,有三种情况,如图: import java.util.*; import java.util.Queue; //下面的所有求结点总 ...

  6. LeetCode 23合并K个升序链表24两两交换链表中的节点

    维护不易,点赞再看,感谢支持 合并K个升序链表 题目描述 给你一个链表数组,每个链表都已经按升序排列. 请你将所有链表合并到一个升序链表中,返回合并后的链表. 示例 1: 输入:lists = [[1 ...

  7. 二叉树寻找祖先C语言,微软算法面试题:给定两个二叉树节点,寻找其最近共同祖先...

    给定一颗二叉树,并指定二叉树中任意两个节点,要求找出这两个节点在二叉树中的最近祖先,假定二叉树每个节点都有一个指向其父节点的指针,图中没有画出来,要求算法的空间复杂度必须是O(1), 时间复杂度为O( ...

  8. 由浅入深:求给定两个树节点的最低公共祖先(二叉树、普通树结构)JAVA实现

    最近看了一道面试题目,觉得很有意思,而且常常被问到,今天综合归纳了一下这道题目,并给出了各种变形题目,附上JAVA版的程序解答. 题目是这样的:寻找二叉树的最低公共祖先?(其中隐含着一个盲点:树是什么 ...

  9. Java实现 LeetCode 24 两两交换链表中的节点

    24. 两两交换链表中的节点 给定一个链表,两两交换其中相邻的节点,并返回交换后的链表. 你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换. 示例: 给定 1->2->3-&g ...

  10. LeetCode中等题之两两交换链表中的节点

    题目 给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点.你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换). 示例 1: 输入:head = [1,2,3,4] 输出:[ ...

最新文章

  1. Android开发之自定义Notification(源代码分享)
  2. jquery 手型 鼠标穿过时_专业电竞鼠标有什么独到之处?看完核技瑞你就知道了
  3. java 3 9 2 6数字排序_GitHub - JourWon/sort-algorithm: 史上最全经典排序算法总结(Java实现)...
  4. 栈/队列/分块问卷调查反馈——Weak in the Middle,Cutting Plants,最小公倍数
  5. DLL/OCX文件的注册与数据执行保护DEP
  6. NOIP 2011 聪明的质检员-二分答案
  7. Weighted Slope One 算法
  8. 负载均衡研究 基础
  9. php require 输出乱码,php输出乱码
  10. VS2010给Activex添加接口
  11. 单片机 c语言百位加上小数点,51单片机水温控制LCD显示加VB上位机温度曲线绘制...
  12. Repeater 中如何绑定计算列的值
  13. 操作系统原理常见面试题总结
  14. NRPE: Unable to read output 问题处理总结
  15. 文章学习_基于HowNet 的词汇语义倾向计算
  16. 李宏毅机器学习Regression
  17. 斯坦福、康奈尔都推荐的量子计算课程教材:《量子计算》
  18. 计算机学报在线阅读,计算机研究与发展计算机学报软件学报电子学报西安交通大学学报.doc...
  19. vim etc mysql my.cnf_mysql配置——my.cnf配置讲解
  20. bitbucket 预览html,BitBucket基本使用操作

热门文章

  1. 《中国电子签约行业发展新篇章白皮书》全新发布,深度解析电子签约发展历程
  2. U盘启动重装windows系统
  3. VRML域值的数据类型
  4. Keil综合(01)_一些常见文件类型的作用和功能说明
  5. 网络安全-防火墙知识点
  6. development 、alpha、production 的区别
  7. 经济管理类电子书下载
  8. 监控类视频的再压缩方案
  9. 发作性睡病患者是否需要药物治疗?
  10. 百度比Google更懂中文的铁证