目录

题目链接:2359. 找到离给定两个节点最近的节点 - 力扣(LeetCode)

题目描述

解法一:双指针路径交汇法​

基本思路

关键步骤

为什么这样可行呢我请问了?

举个例子

特殊情况

Java写法:

C++写法:

运行时间

时间复杂度和空间复杂度

总结


题目链接:2359. 找到离给定两个节点最近的节点 - 力扣(LeetCode)

注:下述题目描述和示例均来自力扣

题目描述

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

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

同时给你两个节点 node1 和 node2 。

请你返回一个从 node1 和 node2 都能到达节点的编号,使节点 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.length
  • 2 <= n <= 105
  • -1 <= edges[i] < n
  • edges[i] != i
  • 0 <= node1, node2 < n

解法一:双指针路径交汇法​

        这道题目的核心是在一个有向图中,每个节点最多只有一条出边,可能存在环。给定两个起点 node1 和 node2,要找一个节点 x,使得两个起点都能到达 x,并且两个起点到 x 的距离中较大的那个值尽可能小。如果多个节点满足条件,选编号最小的;如果不存在,返回 -1。

基本思路

        因为每个节点最多只有一条出边,整个图的结构其实很简单:从任意节点出发,沿着出边走,要么走到尽头(遇到 -1),要么进入一个环然后开始循环。这种结构决定了从 node1 或 node2 出发的路径是唯一的,不会分叉,只是可能绕圈。

关键步骤

  1. ​分别计算两个起点能到达哪些节点​
    用两个数组(比如 dist1 和 dist2)记录 node1 和 node2 到每个节点的距离。初始化时都设为 -1,表示不可达。然后从 node1 出发,沿着出边走,每走一步记录当前步数(距离),直到走到尽头或遇到已经访问过的节点(说明进入环了,再走会重复,此时停掉)。对 node2 同样操作一遍。

  2. ​处理环的干扰​
    如果路径进入环,比如从 node1 走到节点 A 后开始绕圈,那么第一次走到 A 时的距离就是最短距离。之后再绕圈只会让距离变大,所以遇到访问过的节点直接停掉,避免死循环。

  3. ​找最优节点​
    遍历所有节点,如果一个节点在 dist1 和 dist2 中都有记录(说明两个起点都能到达它),就计算 max(dist1[i], dist2[i])(即两个距离的较大值)。我们需要的正是这个较大值最小的节点。如果有多个节点值相同,选编号最小的那个。

为什么这样可行呢我请问了?

  • ​路径唯一性​​:因为每个节点最多一条出边,从起点出发的路径是唯一的,不会分叉,所以记录的距离就是最短距离。
  • ​环的处理​​:遇到环就停,保证了第一次到达节点的距离是最小的,后续绕圈只会增加距离,不用考虑。
  • ​最优解筛选​​:直接比较所有公共节点的距离较大值,取最小值,符合题目要求。

举个例子

假设图是 edges = [2, 2, 3, -1],node1=0,node2=1:

  • node1(0)的路径:0 → 2 → 3,距离 dist1[2]=1dist1[3]=2
  • node2(1)的路径:1 → 2 → 3,距离 dist2[2]=1dist2[3]=2
    公共节点是 2 和 3。节点 2 的较大值是 max(1,1)=1,节点 3 是 max(2,2)=2,所以选节点 2。

特殊情况

        如果两个起点没有公共可达节点(比如一个走到尽头,另一个进环但路径不重合),直接返回 -1。


Java写法:

class Solution {public int closestMeetingNode(int[] edges, int node1, int node2) {int n = edges.length;int[] dist1 = new int[n];int[] dist2 = new int[n];Arrays.fill(dist1, -1);Arrays.fill(dist2, -1);// 计算 node1 到各节点的距离int cur = node1, steps = 0;while (cur != -1 && dist1[cur] == -1) {dist1[cur] = steps++;cur = edges[cur];}// 计算 node2 到各节点的距离cur = node2;steps = 0;while (cur != -1 && dist2[cur] == -1) {dist2[cur] = steps++;cur = edges[cur];}// 寻找最优节点int minMaxDist = Integer.MAX_VALUE;int ans = -1;for (int i = 0; i < n; i++) {if (dist1[i] != -1 && dist2[i] != -1) {int maxDist = Math.max(dist1[i], dist2[i]);if (maxDist < minMaxDist || (maxDist == minMaxDist && i < ans)) {minMaxDist = maxDist;ans = i;}}}return ans;}
}

C++写法:

#include <vector>
#include <climits>
#include <algorithm>
using namespace std;class Solution {
public:int closestMeetingNode(vector<int>& edges, int node1, int node2) {int n = edges.size();vector<int> dist1(n, -1);vector<int> dist2(n, -1);// 计算 node1 到各节点的距离int cur = node1, steps = 0;while (cur != -1 && dist1[cur] == -1) {dist1[cur] = steps++;cur = edges[cur];}// 计算 node2 到各节点的距离cur = node2;steps = 0;while (cur != -1 && dist2[cur] == -1) {dist2[cur] = steps++;cur = edges[cur];}// 寻找最优节点int minMaxDist = INT_MAX;int ans = -1;for (int i = 0; i < n; i++) {if (dist1[i] != -1 && dist2[i] != -1) {int maxDist = max(dist1[i], dist2[i]);if (maxDist < minMaxDist || (maxDist == minMaxDist && i < ans)) {minMaxDist = maxDist;ans = i;}}}return ans;}
};

运行时间

时间复杂度和空间复杂度

时间复杂度:O(n)​

空间复杂度:O(n)​​​




总结

​问题核心​​:给定一个有向图(节点最多一条出边,可能存在环),需找到节点 node1 和 node2 均可达的节点,使两者到该节点距离的​​较大值最小化​​。若有多个解,返回最小节点编号;无解则返回 -1

​解法精髓​​:采用 ​​双指针路径交汇法​​(Dual-Pointer Path Convergence)

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

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

相关文章

Termux可用中间人网络测试工具Xerosploit

Termux可用中间人网络测试工具Xerosploit。 Xerosploit 是一款基于 MITM 的本地网络渗透测试工具包。 食用方法&#xff1a; git clone https://github.com/LionSec/xerosploit cd xerosploit sudo python3 install.py 运行&#xff1a; sudo xerosploit 使用备注&#xff1…

vue3 导出excel

需求&#xff1a;导出自带格式的excel表格 1.自定义二维数组格式 导出 全部代码&#xff1a; <el-button click"exportExcel">导出</el-button> const exportExcel () > {const data [[商品, 单价, 数量, 总价],[A, 100, 1.55, { t: n, f: B2*C2…

【SQL】关键字

ORDER BY ORDER BY(排序) 语句可以按照一个或多个列的值进行升序&#xff08;ASC&#xff09;或降序&#xff08;DESC&#xff09;排序。 MAX / MIN MAX() 函数返回一组值中的最大值。这个函数常用于数字字段&#xff0c;但也可以用于文本字段来找出按字典顺序最后的元素。 …

深度学习篇---OC-SORT实际应用效果

OC-SORT 算法在实际应用中的效果可从准确性、鲁棒性、效率三个核心维度评估,其表现与传统多目标跟踪算法(如 SORT、DeepSORT)相比有显著提升,尤其在复杂场景中优势突出。以下是具体分析: 一、准确性:目标关联更可靠 1. 遮挡场景下的 ID 保持能力 优势表现: 传统算法(…

处理知识库文件_编写powershell脚本文件_批量转换其他格式文件到pdf文件---人工智能工作笔记0249

最近在做部门知识库&#xff0c;选用的dify&#xff0c;作为rag的工具&#xff0c;但是经过多个对比&#xff0c;最后发现&#xff0c; 比较好用的是&#xff0c;纳米搜索&#xff0c;但是可惜纳米搜索无法在内网使用&#xff0c;无法把知识库放到本地&#xff0c;导致 有信息…

NSSCTF [NISACTF 2022]ezheap

2058.[NISACTF 2022]ezheap(堆溢出) [NISACTF 2022]ezheap 1.准备 2.ida分析 main函数 int __cdecl main(int argc, const char **argv, const char **envp) {char *command; // [esp8h] [ebp-10h]char *s; // [espCh] [ebp-Ch]setbuf(stdin, 0);setbuf(stdout, 0);s (cha…

微信小店推客系统达人用户管理的数据支持和便利

达人粉丝画像关联&#xff1a;系统通过技术手段&#xff0c;一定程度上获取达人粉丝的画像数据&#xff0c;如年龄分布、性别比例、地域分布、消费偏好等。运营者可以根据这些粉丝画像&#xff0c;为达人匹配更符合其粉丝需求的商品。例如&#xff0c;若某达人的粉丝以年轻女性…

LeetCode 215:数组中的第K个最大元素 - 两种高效解法详解

文章目录 问题描述解法一&#xff1a;快速选择算法&#xff08;QuickSelect&#xff09;算法思想算法步骤Java实现复杂度分析算法特点 解法二&#xff1a;最小堆&#xff08;优先队列&#xff09;算法思想算法步骤Java实现复杂度分析算法特点 两种解法比较测试示例总结 在算法面…

视频压制(Video Encoding/Compression)

视频压制是指通过特定的算法和技术&#xff0c;将原始视频文件转换为更小体积或更适合传播的格式的过程。其核心目的是在尽量保持画质的前提下&#xff0c;减少视频的文件大小&#xff0c;或适配不同播放设备、网络环境的需求。 --- ### **关键概念解析** 1. **为什么需要压制…

如何做好一个决策:基于 Excel的决策树+敏感性分析应用

决策点: 开发新产品? (是 / 否) 因素 (如果是): 市场接受度 (高 / 中 / 低);概率: 高(0.3), 中(0.5), 低(0.2) 结果值 (NPV): 高(+$1M), 中(+$0.2M), 低(-$0.5M) 不开发成本/收益: $0 开发计算: EMV(市场接受度) = (0.3 * 1M) + (0.5 * 0.2M) + (0.2 * -0.5M) = $0.3M + $…

Java中的设计模式实战:单例、工厂、策略模式的最佳实践

Java中的设计模式实战&#xff1a;单例、工厂、策略模式的最佳实践 在Java开发中&#xff0c;设计模式是构建高效、可维护、可扩展应用程序的关键。本文将深入探讨三种常见且实用的设计模式&#xff1a;单例模式、工厂模式和策略模式&#xff0c;并通过详细代码实例&#xff0…

PyTorch学习(1):张量(Tensor)核心操作详解

PyTorch学习(1)&#xff1a;张量&#xff08;Tensor&#xff09;核心操作详解 一、张量&#xff08;Tensor&#xff09;核心操作详解 张量是PyTorch的基础数据结构&#xff0c;类似于NumPy的ndarray&#xff0c;但支持GPU加速和自动微分。 1. 张量创建与基础属性 import to…

Docker部署Spark大数据组件:配置log4j日志

上一篇《Docker部署Spark大数据组件》中&#xff0c;日志是输出到console的&#xff0c;如果有将日志输出到文件的需要&#xff0c;需要进一步配置。 配置将日志同时输出到console和file 1、停止spark集群 docker-compose down -v 2、使用自带log4j日志配置模板配置 cp -f …

Nginx Lua模块(OpenResty)实战:动态化、智能化你的Nginx,实现复杂Web逻辑 (2025)

更多服务器知识&#xff0c;尽在hostol.com 嘿&#xff0c;各位Nginx的“铁杆粉丝”和“配置大师”们&#xff01;咱们都知道&#xff0c;Nginx以其超凡的性能、稳定性和丰富的模块化功能&#xff0c;在Web服务器、反向代理、负载均衡等领域独步青云&#xff0c;简直是服务器软…

一、CentOS7通过kubeadm安装K8S 1.20.1版本

一、准备机器 所有节点执行 准备3台虚拟机&#xff08;2核4G&#xff0c;CentOS 7&#xff09;&#xff0c;配置如下&#xff1a; hostnamectl set-hostname k8s-master # 在Master节点执行 hostnamectl set-hostname k8s-node1 # Worker1节点执行 hostnamectl set-hostna…

AgenticSeek,开源本地通用AI Agent,自主执行任务

AgenticSeek是一款完全本地化的开源AI助手&#xff0c;作为Manus的开源替代品&#xff0c;专为保护用户隐私而设计。它能够在本地设备上执行多种任务&#xff0c;包括网页浏览、代码编写和复杂项目的规划&#xff0c;确保所有操作和数据均在用户的设备上完成。 AgenticSeek是什…

C 语言学习笔记(指针6)

内容提要 内存操作 内存操作的函数 内存操作 我们对于内存操作需要依赖于string.h头文件中相关的库函数。 内存的库函数 内存填充 头文件&#xff1a;#include <string.h>函数原型 void* memset(void* s, int c, size_t)函数功能&#xff1a;将内存块s的前n个字节…

Grafana-Gauge仪表盘

仪表盘是一种单值可视化。 可让您快速直观地查看某个值落在定义的或计算出的最小和最大范围内的位置。 通过重复选项&#xff0c;您可以显示多个仪表盘&#xff0c;每个对应不同的序列、列或行。 支持的数据格式 单值 数据集中只有一个值&#xff0c;会生成一个显示数值的…

解决Vue项目依赖错误:使用electron-vite重建

文章目录 开端解决方案&#xff1a;使用 electron-vite Vue 重建项目1. 环境准备2. 创建新项目3. 安装依赖并启动项目 开端 在开发过程中&#xff0c;我遇到了一个令人头疼的错误提示&#xff1a; 0:0 error Parsing error: Cannot find module vue/cli-plugin-babel/preset…

WPF prism

Prism Prism.Dryloc 包 安装 Nuget 包 - Prism.DryIoc 1. 修改 App.xaml 修改 App.xaml 文件&#xff0c;添加 prism 命名空间, 继承由 Application → PrismApplication&#xff0c;删除默认启动 url, StartupUri“MainWindow.xaml” <dryioc:PrismApplicationx:Class…