Leetcode.2359 找到离给定两个节点最近的节点
创始人
2024-05-28 11:12:03
0

题目链接

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==edges.lengthn == edges.lengthn==edges.length
  • 2<=n<=1052 <= n <= 10^52<=n<=105
  • −1<=edges[i]
  • edges[i]!=iedges[i] != iedges[i]!=i
  • 0<=node1,node2

解法一:BFS

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

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

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

代码:

class Solution {
public:
// 建图unordered_map> g;//bfs 求起点 root 到各个点的距离矩阵void bfs(int root,vector & dist){queue 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& 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 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& edges, int node1, int node2) {int n = edges.size();auto dfs = [&](int u) -> vector{vector 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;}
};

相关内容

热门资讯

小说盘龙里那些人为什么要抓主角... 小说盘龙里那些人为什么要抓主角的母亲啊?还有主角把那魔法阵破了出来的那个吃了N多巨龙的是什么东西啊?...
今天天气晴朗,我很高兴能出去和... 今天天气晴朗,我很高兴能出去和朋友一起玩今天天气晴朗,我很高兴能出去和朋友一起玩,和朋友聊天有些事情...
星空下的仁医小女孩是第几集 星空下的仁医小女孩是第几集星空下的仁医小女孩是第八集。是第八集,卓盈发现芝桦拿贺倒卧梯间,芝桦经检查...
晚上有什么虫子叫? 晚上有什么虫子叫?晚上有曲曲在叫,挺好听的。
在你的学生时期你碰到过哪些全能... 在你的学生时期你碰到过哪些全能的老师?我印象最深者逗和刻的就是我的数学老指敬师了,他真的是一位非常全...
有没有系统类型的动漫啊??? 有没有系统类型的动漫啊???要国漫~( ̄▽ ̄~)~目前没有发现什么关于系统类的动漫。大部分是一些想象...
求带“马”的祝福语,最好大气点... 求带“马”的祝福语,最好大气点的,适合企业用的. 龙马精神送康健,马到成功运气来,策马奔腾业绩生链基...
为何血界战线12集迟迟不出 为何血界战线12集迟迟不出很可能被禁了因为还没弄好没有制作完据说最后一集会超过30分钟
如果你的男朋友惹你生气了,你会... 如果你的男朋友惹你生气了,你会怎么对待他?我之前是冷暴力,但是时间久了你会明白,冷暴力真的解决不了什...
学中医要看哪些书籍? 学中医要看哪些书籍?第一梯队 黄帝内经,难经。第二梯队 神农本草经,伤寒论,金匮要略。第三梯队。。...
新郎爱情宣言怎么写 新郎爱情宣言怎么写这个怎么写呢?你根据他书上写就可以了,要么就是根据网上这一写。新郎的爱情宣言,其实...
火影忍者里面的那个钢子铁和神月... 火影忍者里面的那个钢子铁和神月出云到底是干吗的先纠正一下神月出云刚刚升为上忍,钢子铁的确是中忍。可以...
为什么p或q中,有一真为真,而... 为什么p或q中,有一真为真,而一假不为假呢?既然是“或”,那如果正好是“或”了那个假的,整个命题不是...
正青春每个人结局 正青春每个人结局《正青春》各人物大结局是什么章鱼儿结果、出生很平初入职场章鱼儿阴差阳错进到SW,变成...
我是美术生,以后想做漫画编辑,... 我是美术生,以后想做漫画编辑,上大学应该学什么专业?动漫专业应该就可以把
伤感的爱情小故事 伤感的爱情小故事你的人生就是爱情的小故事
魅力的魅在词语中是什么意思 魅力的魅在词语中是什么意思意思是指的是与众不同, 独一无二的人,指一个人“充满了吸引力”。形容一个人...
解离,离解和电离三个概念一样吗... 解离,离解和电离三个概念一样吗?解离、离解和电离这三个概念在化学中是有一些区别的。1. 解离 (Di...
怎样才能活的开心 怎样才能活的开心开心很简单,可以去旅游,可以去玩游戏,可以去爬山,可以去郊游,可以去约会,太多了哈做...
梦幻琉璃玉罩消耗灵气吗 梦幻琉璃玉罩消耗灵气吗会消耗灵气的,, 每保护一次就消耗一点灵气,金甲仙衣会帮你承受大约50%的物理...