[HOT 100] 1617. 統計子樹中城市之間最大距離

文章目錄

      • 1. 題目鏈接
      • 2. 題目描述
      • 3. 題目示例
      • 4. 解題思路
      • 5. 題解代碼
      • 6. 復雜度分析

1. 題目鏈接


1617. 統計子樹中城市之間最大距離 - 力扣(LeetCode)

2. 題目描述


給你 n 個城市,編號為從 1n 。同時給你一個大小為 n-1 的數組 edges ,其中 edges[i] = [ui, vi] 表示城市 uivi 之間有一條雙向邊。題目保證任意城市之間只有唯一的一條路徑。換句話說,所有城市形成了一棵 樹 。

一棵 子樹 是城市的一個子集,且子集中任意城市之間可以通過子集中的其他城市和邊到達。兩個子樹被認為不一樣的條件是至少有一個城市在其中一棵子樹中存在,但在另一棵子樹中不存在。

對于 d1n-1 ,請你找到城市間 最大距離 恰好為 d 的所有子樹數目。

請你返回一個大小為 n-1 的數組,其中第 d 個元素(下標從 1 開始)是城市間 最大距離 恰好等于 d 的子樹數目。

請注意,兩個城市間距離定義為它們之間需要經過的邊的數目。


3. 題目示例


示例 1 :

輸入:n = 4, edges = [[1,2],[2,3],[2,4]]
輸出:[3,4,0]
解釋:
子樹 {1,2}, {2,3} 和 {2,4} 最大距離都是 1 。
子樹 {1,2,3}, {1,2,4}, {2,3,4} 和 {1,2,3,4} 最大距離都為 2 。
不存在城市間最大距離為 3 的子樹。

示例 2 :

輸入:n = 2, edges = [[1,2]]
輸出:[1]

4. 解題思路

  1. 問題理解
    • 給定一棵樹,統計所有連通子圖
    • 對每個可能的直徑d,計算有多少子圖的直徑等于d
    • 直徑定義為子圖中最長路徑的邊數
  2. 核心算法
    • 使用回溯法枚舉所有可能的節點子集(2^n種可能)
    • 對每個子集檢查是否構成連通子圖
    • 計算連通子圖的直徑并統計結果
  3. 直徑計算
    • 采用樹形DP方法
    • 通過DFS計算每個節點的最長路徑
    • 在遞歸過程中維護全局直徑
  4. 連通性檢查
    • 比較訪問標記數組和選擇數組
    • 兩者一致說明子圖連通

5. 題解代碼


class Solution {private List<Integer>[] g; // 鄰接表存儲樹結構private boolean[] inSet;    // 記錄哪些節點在當前子集中private boolean[] vis;      // DFS訪問標記private int[] ans;          // 結果數組,ans[d]表示直徑為d+1的子圖數量private int n, diameter;   // n是節點總數,diameter記錄當前子圖的直徑public int[] countSubgraphsForEachDiameter(int n, int[][] edges) {this.n = n;// 初始化鄰接表g = new ArrayList[n];Arrays.setAll(g, e -> new ArrayList<>());// 構建樹結構(節點編號轉為0-based)for (var e : edges) {int x = e[0] - 1, y = e[1] - 1;g[x].add(y);g[y].add(x);}ans = new int[n - 1]; // 直徑范圍是1到n-1inSet = new boolean[n];f(0); // 開始遞歸枚舉所有子集return ans;}// 遞歸枚舉所有可能的節點子集private void f(int i) {// 遞歸終止條件:處理完所有節點if (i == n) {// 檢查當前子集是否構成連通子圖for (int v = 0; v < n; ++v)if (inSet[v]) {vis = new boolean[n];diameter = 0;dfs(v); // 從第一個選中的節點開始DFSbreak;}// 如果子圖連通且直徑有效,更新結果if (diameter > 0 && Arrays.equals(vis, inSet))++ans[diameter - 1];return;}// 不選當前節點if(i + 1);// 選當前節點iinSet[i] = true;f(i + 1);inSet[i] = false; // 回溯}// 計算子圖的直徑(同時標記訪問過的節點)private int dfs(int x) {vis[x] = true;int maxLen = 0; // 記錄從x出發的最長路徑長度for (int y : g[x])if (!vis[y] && inSet[y]) { // 只考慮選中的且未訪問的鄰居int ml = dfs(y) + 1;  // 遞歸計算子節點路徑長度diameter = Math.max(diameter, maxLen + ml); // 更新直徑maxLen = Math.max(maxLen, ml); // 更新當前最大長度}return maxLen;}
}

6. 復雜度分析


時間復雜度:O(n * 2^n)

  • 枚舉所有子集:O(2^n)
  • 對每個子集進行DFS:O(n)
  • 總復雜度為兩者的乘積

空間復雜度:O(n)

  • 鄰接表存儲空間:O(n)
  • 遞歸調用棧深度:O(n)
  • 各種標記數組:O(n)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/904120.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/904120.shtml
英文地址,請注明出處:http://en.pswp.cn/news/904120.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

接口自動化——參數化

之前有說過&#xff0c;通過pytest測試框架標記參數化功能可以實現數據驅動測試。數據驅動測試使用的文件主要有以下類型&#xff1a; txt 文件 csv 文件excel 文件json 文件yaml 文件.... 本文主要講的就是以上幾種文件類型的讀取和使用 一.txt 文件讀取使用 首先創建一個 …

游戲引擎學習第257天:處理一些 Win32 相關的問題

設定今天的工作計劃 今天我們本來是打算繼續開發性能分析器&#xff08;Profiler&#xff09;&#xff0c;但在此之前&#xff0c;我們認為有一些問題應該先清理一下。雖然這類事情不是我們最關心的核心內容&#xff0c;但我們覺得現在是時候處理一下了&#xff0c;特別是為了…

實驗三 觸發器及基本時序電路

1.觸發器的分類&#xff1f;各自的特點是什么&#xff1f; 1 、 D 觸發器 特點&#xff1a;只有一個數據輸入端 D &#xff0c;在時鐘脈沖的觸發沿&#xff0c;輸出 Q 的狀態跟隨輸入端 D 的 狀態變化&#xff0c;即 &#xff0c;功能直觀&#xff0c;利于理解和感受…

硬件加速模式Chrome(Edge)閃屏

Chrome開啟“硬件加速模式”后&#xff0c;打開瀏覽器會閃屏或看視頻會閃屏&#xff0c;如果電腦只有集顯&#xff0c;直接將這個硬件加速關了吧&#xff0c;沒啥必要開著 解決方法 讓瀏覽器使用獨立顯卡 在Windows左下角搜索 圖形設置 &#xff0c;將瀏覽器添加進去&#…

前端工程化利器:Node.js 文件匹配庫 fast-glob 完全指南——比傳統方案快 350% 的「文件搜索神器」

為什么需要 fast-glob&#xff1f; 在前端工程化場景中&#xff0c;文件匹配是高頻操作&#xff1a;自動化構建、資源打包、靜態資源管理等都依賴高效的路徑匹配。傳統的 node-glob 雖然功能齊全&#xff0c;但性能瓶頸明顯。fast-glob 應運而生——它以 極簡 API 和 超高性能…

React class 的組件庫與函數組件適配集成

如果你有一個 基于 React class 的組件庫&#xff0c;現在需要在 React hooks 函數組件中使用&#xff0c;你可以通過以下幾種方式實現適配和集成&#xff1a; 數據生命周期確保 class 組件使用 React.forwardRef 導出&#xff08;或手動綁定 ref&#xff09; ? 1. 直接使用 c…

Sway初體驗

Sway&#xff08;縮寫自 SirCmpwn’s Wayland compositor[1]&#xff09;是一款專為 Wayland 設計的合成器&#xff0c;旨在與 i3 完全兼容。根據官網所述&#xff1a; Sway 是 Wayland 的合成器&#xff0c;也是 x11 的 i3 窗口管理器的替代品。它可以根據您現有的 i3 配置工作…

dubbo 參數校驗-ValidationFilter

org.apache.dubbo.rpc.Filter 核心功能 攔截RPC調用流程 Filter是Dubbo框架中實現攔截邏輯的核心接口&#xff0c;作用于服務消費者和提供者的作業鏈路&#xff0c;支持在方法調用前后插入自定義邏輯。如參數校驗、異常處理、日志記錄等。擴展性機制 Dubbo通過SPI擴展機制動態…

Lesson 16 A polite request

Lesson 16 A polite request 詞匯 park n. 公園&#xff0c;停車場&#xff0c;莊園 v. 停車&#xff0c;泊車 例句&#xff1a;讓我來停車。    Let me park. 相關&#xff1a;spot n. 車位 區別&#xff1a;garden n. 花園 [小&#xff0c;私家的] 例句&#xff1a;我們…

解決 Builroot 系統編譯 perl 編譯報錯問題

本文提供一種修復 Builroot 系統編譯 perl 編譯報錯途徑 2025-05-04T22:45:08 rm -f pod/perl5261delta.pod 2025-05-04T22:45:08 /usr/bin/ln -s perldelta.pod pod/perl5261delta.pod 2025-05-04T22:45:08 /usr/bin/gcc -c -DPERL_CORE -fwrapv -fpcc-struct-return -pipe -f…

Spring MVC 中解決中文亂碼問題

在 Spring MVC 中解決中文亂碼問題&#xff0c;需要從 請求參數編碼 和 響應內容編碼 兩方面入手。以下是完整的解決方案&#xff1a; 一、解決請求參數中文亂碼 1. POST 請求編碼&#xff08;表單提交&#xff09; 配置 CharacterEncodingFilter 在 web.xml 中添加 Spring 提…

MYSQL數據庫突然消失

之前在下載mysql時發現沒有my.ini。考慮到后面的項目可能需要&#xff0c;看著教程自己創建了一次&#xff0c;當時就發生了所有數據庫消失的問題&#xff0c;近幾天這種事件又發生了。我在服務里看到我有mysql和mysql57兩個服務&#xff0c;啟動一個的時候另一個就無法啟動&am…

【Spring】idea + maven 從零創建Spring IoC容器示例

【Spring】idea maven 從零創建Spring IoC容器示例 1. 環境準備2. 創建maven項目3. 添加依賴4. 創建Java類與接口4.1 定義接口UserService4.2 實現接口UserServiceImpl 5. 配置Spring IoC容器6. 編寫主類調用IoC容器擴展&#xff1a;使用注解方式實現IoC1. 修改beans.xml2.使用…

面試回答之STAR結構

面試回答之STAR結構 1. STAR結構的起源 STAR是行為面試法&#xff08;Behavioral Interview&#xff09;的核心框架&#xff0c;由以下四個單詞首字母組成&#xff1a; ? Situation&#xff08;情境&#xff09; ? Task&#xff08;任務&#xff09; ? Action&#xff…

Kubernetes部署運行應用

①使用 Deployment 運行一個無狀態應用 ②運行一個單實例有狀態應用 ③運行一個有狀態的應用程序 ④使用 Persistent Volumes 部署 WordPress 和 MySQL

二叉搜索樹的最近祖先(遞歸遍歷)

235. 二叉搜索樹的最近公共祖先 - 力扣&#xff08;LeetCode&#xff09; class Solution { private:TreeNode*traversal(TreeNode*cur,TreeNode*p,TreeNode*q){if(curNULL){return NULL;}if(cur->val>p->val&&cur->val>q->val){TreeNode*lefttrave…

網絡:TCP三次握手、四次揮手

目錄 深刻理解三次握手 深刻理解四次揮手 深刻理解三次握手 三次握手時&#xff0c;如果最后一個ACK包&#xff0c;服務器沒有收到&#xff0c;此時&#xff1a; 客戶端&#xff1a;認為已經建立鏈接 服務器&#xff1a;認為沒有建立鏈接&#xff0c;還在超時等待。 而此…

MySQL 實戰 45 講 筆記 ----來源《極客時間》

01 | 基礎架構&#xff1a;一條SQL查詢語句是如何執行的&#xff1f; 1. MySQL 可以分為 Server層 和 存儲引擎層 兩部分。Server 層包括連接器、查詢緩存、分析器、優化器、執行器等。存儲引擎層支持 InnoDB、MyISAM等. (1) 連接器&#xff1a;管理連接&#xff0c;權限認證…

nextjs+supabase vercel部署失敗

1.不能含有<any> 改成unknown或者增加類(如圖) 2.檢查vecel是否配置環境變量&#xff08;即supabase的url和anon-key&#xff09;

數據庫Mysql_聯合查詢

或許自己的不完美才是最完美的地方&#xff0c;那些讓自己感到不安的瑕疵&#xff0c;最終都會變成自己的特色。 ----------陳長生. 1.介紹 1.1.為什么要進行聯合查詢 在數據設計的時候&#xff0c;由于范式的需求&#xff0c;會被分為多個表&#xff0c;但是當我們要查詢數據…