力扣每日一題——找到離給定兩個節點最近的節點

目錄

題目鏈接: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…