力扣每日一题——找到离给定两个节点最近的节点

article/2025/7/6 23:52:26

目录

题目链接: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.hkcw.cn/article/TWPnSJQtCl.shtml

相关文章

一种通用图片红色印章去除的工具设计

朋友今天下午需要处理个事情&#xff0c;问我有没有什么好的办法能够去除&#xff0c;核心问题是要去除图片上的印章。记得以前处理过类似的需求&#xff0c;photoshop操作比较简单&#xff0c;本质是做运算。这种处理方式有很多&#xff0c;比如现在流行的大模型&#xff0c;一…

Bean对象循环依赖

Spring 循环依赖是指 多个 Bean 对象之间形成相互依赖的闭环。 三级缓存解决循环依赖 缓存级别存储内容作用一级缓存完整的 Bean&#xff08;singletonObjects&#xff09;存放已初始化完成的 Bean二级缓存半成品 Bean&#xff08;earlySingletonObjects&#xff09;存放已实例…

文心快码参编国内首个软件开发智能体技术规范

近期&#xff0c;中国信息通信研究院&#xff08;简称“中国信通院”&#xff09;与中国工商银行、北京兴云数科技术有限公司、北京百度网讯科技有限公司牵头&#xff0c;联合农业银行、邮储银行、科大讯飞、腾讯、阿里、华为等二十余家头部企业&#xff0c;共同编制并正式发布…

【笔记】Windows 系统安装 Supabase CLI 完整指南(基于 Scoop)

#工作记录 前言 在进行开源项目 Suna 部署过程中&#xff0c;执行设置向导时遭遇报错&#xff1a;❌ Supabase CLI is not installed. 根据官方文档指引&#xff0c;需通过 Windows 包管理工具Scoop安装 Supabase CLI。 安装步骤记录 步骤 1&#xff1a;确保 Scoop 已正确安…

深圳南山沙河社区联合心美行动举办“青少年天赋提升”助青春成长

2025年5月29日——在六一国际儿童节到来之际&#xff0c;深圳市南山区沙河街社区联合北京红十字基金会了凡积善之家心美行动志愿团&#xff0c;共同举办“青少年能力天赋提升”主题公益讲座。活动特邀心美行动发起人、中韩医学文化特使、国际高级心理咨询师陈艳林女士担任主讲嘉…

allWebPlugin中间件VLC专用版之截图功能介绍

背景 VLC控件原有接口具有视频截图方法&#xff0c;即video对象的takeSnapshot方法&#xff0c;但是该方法返回的是一个IPicture对象&#xff0c;不适合在谷歌等现代浏览器上使用。因此&#xff0c;本人增加一个新的视频截图方法takeSnapshot2B64方法&#xff0c;直接将视频截图…

深度解析MCP协议

全面解读MCP协议&#xff1a;从技术原理到实践应用 ©作者|Monalisa 来源|神州问学 什么是MCP协议 MCP&#xff08;ModelContextProtocol&#xff09;是Anthropic在2024年11月推出的开放协议&#xff0c;旨在标准化大型语言模型与外部数据源、工具之间的交互方式。简单来…

Qt5.14.2编译的MySQL5.7.25对应64位驱动文件下载:项目核心功能/场景

Qt5.14.2编译的MySQL5.7.25对应64位驱动文件下载&#xff1a;项目核心功能/场景 【下载地址】Qt5.14.2编译的MySQL5.7.25对应64位驱动文件下载 此项目为开发者提供了Qt5.14.2编译环境下&#xff0c;MySQL5.7.25版本的64位驱动文件&#xff0c;包含libqsqlmysql.a、qsqlmysql.dl…

一文完成 Docker 部署Canel 并配置ES与MySQL 的数据同步

Docker 部署Canel 并且配置ES与MySQL 的数据同步 前期配置 开启MySQL binlog日志 [mysqld] log-binmysql-bin # 开启 binlog binlog-formatROW # 选择 ROW 模式 server_id1 # 配置 MySQL replaction 需要定义&#xff0c;不要和 canal 的 slaveId 重复创建 Canal 用户并授权…

mysql的锁-->一篇读懂所有锁机制

目录 mysql的锁 概述&#xff1a;根据mysql锁的大类型可以分为 我们先来讲一下范围最大的全局锁 使用 为什么要使用全局锁&#xff1f; 使用全局锁进行备份的缺点 表级锁 表锁 1.共享读表锁的语法 2.排斥写表锁 元数据锁 意向锁 什么是意向锁 怎么产生意向锁 意向…

免费送源码:Java+C+++MySQL C++学生信息管理系统的设计与实现 计算机毕业设计原创定制

目 录 1 绪论 1 1.1选题背景 1 1.2课题研究意义 1 1.3论文结构与章节安排 1 2 相关技术介绍 3 2.1 C语言 3 2.2 Mysql数据库 3 3 系统分析 3 3.1 可行性分析 3 3.1.1 技术可行性分析 3 3.1.2 经济可行性分析 3 3.1.3 法律可行性分析 3 3.2 系统功能分析 3 3.2.1…

达梦DTS数据迁移工具生产篇(MySQL->DM8)

本文章使用的DTS工具为 2024年9月18日的版本&#xff0c;使用的目的端DM8数据库版本为2023年12月的版本&#xff0c;注意数据库版本和DTS版本之间跨度不要太大&#xff0c;以免出现各种兼容性的报错。若发现版本差距过大时&#xff0c;请联系达梦技术服务工程师处理。 1. 迁移…

MySQL 数据库备份与还原

作者&#xff1a;IvanCodes 日期&#xff1a;2025年5月18日 专栏&#xff1a;MySQL教程 思维导图 备份 (Backup) 与 冗余 (Redundancy) 的核心区别: &#x1f3af; 备份是指创建数据的副本并将其存储在不同位置或介质&#xff0c;主要目的是在发生数据丢失、损坏或逻辑错误时进…

MySQL Binlog 日志查看方法及查看内容解析

一、Binlog 日志概述 Binlog&#xff08;二进制日志&#xff09;记录了 MySQL 数据库执行的所有更改数据的操作&#xff0c;包括INSERT、UPDATE、DELETE等。它对于数据恢复、主从复制以及审计等方面有着至关重要的作用。 二、查看 Binlog 日志方法 开启 Binlog 日志功能 默…

【金仓数据库征文】金仓数据库(KingbaseES)迁移与集群部署实战:从MySQL到KES的全流程解析

随着企业信息化和数字化转型的加速&#xff0c;企业对数据库的要求不仅仅局限于基础的数据存储功能&#xff0c;更涉及到性能、可扩展性、安全性、以及持续的系统升级能力。因此&#xff0c;数据库迁移已经成为现代企业升级IT架构时的一个重要步骤。特别是在国产化替代的浪潮中…

【MySQL】 基本查询(下)

欢迎拜访:雾里看山-CSDN博客 本篇主题:【MySQL】 基本查询(下) 发布时间:2025.2.18 隶属专栏:MySQL 目录 Update语法案例Delete删除数据语法案例截断表语法案例插入查询结果语法案例聚合函数函数介绍案例group by子句的使用语法having和where案例结语Update 语法 UPDATE …

MySQL开大招了! 三十周年庆典推出四项 OCP 认证免费

&#x1f389; MySQL 30岁生日大礼包&#xff01;OU掏家底了&#xff01; 狠心决定&#xff1a;4.20-7.31期间 &#x1f525;全系列MySQL课程四大认证 &#x1f525;原价$2,500/人的考试资格 通&#xff01;通&#xff01;免&#xff01;费&#xff01; &#x1f4a1;30年只此一…

Kettle9.1链接mysql报错: Connection failed. Verify all connection parameters and confirm that the appropr

Connection failed. Verify all connection parameters and confirm that the appropriate driver is installed. The server time zone value ‘D1’ is unrecognized or represents more than one time zone. You must configure either the server or JDBC 连接失败。验证所…

2025最新版|八股文面试题库+答案详解(附高频考点解析)

我相信大多 Java 开发的程序员或多或少经历过 BAT 一些大厂的面试&#xff0c;也清楚一线互联网大厂 Java 面试是有一定难度的&#xff0c;小编经历过多次面试&#xff0c;有满意的也有备受打击的。因此呢小编想把自己这么多次面试经历以及近期的面试真题来个汇总分析&#xff…

库室门禁报警系统|多功能控制器运用

库室门禁报警系统 库室门禁报警系统是一套综合性的安全防护体系&#xff0c;它集成了门禁控制、入侵报警、视频监控等多种功能。门禁控制功能通过对人员进出权限的精准管理&#xff0c;严格限制无关人员进入库室。系统可根据人员的身份、职务、工作需求等设定不同的权限&#…