Swift 圖論實戰:DFS 算法解鎖 LeetCode 323 連通分量個數

在這里插入圖片描述
在這里插入圖片描述

文章目錄

    • 摘要
    • 描述
      • 示例
    • 題解答案
      • DFS 遍歷每個連通區域
      • Union-Find(并查集)
    • 題解代碼分析(Swift 實現:DFS)
    • 題解代碼詳解
      • 構建鄰接表
      • DFS 深度優先搜索
      • 遍歷所有節點
    • 示例測試及結果
      • 示例 1
      • 示例 2
      • 示例 3
    • 時間復雜度分析
    • 空間復雜度分析
    • 總結

摘要

圖是算法中最具挑戰性的結構之一,而“連通分量”這個詞聽起來也有點像社交網絡里的“圈子”概念。給你一張無向圖,節點編號從 0 到 n-1,現在請你找出這個圖中到底有多少個互相連著的群體(連通分量)

這題其實在很多實際問題里都能找到身影,比如社交圖譜分析、網絡故障檢測、孤島計算等等。

這篇文章將用 Swift 帶你搞懂這題背后的圖遍歷方法(DFS 和并查集兩種思路),并提供完整代碼與解釋。

描述

給定一個由 n 個節點(編號為 0n - 1)組成的無向圖和一個邊列表 edges,請你計算圖中連通分量的數量。

示例

輸入:

n = 5
edges = [[0, 1], [1, 2], [3, 4]]

輸出:

2

解釋:圖中有兩個連通分量:{0,1,2} 和 {3,4}

題解答案

這題有兩個常見解法:

DFS 遍歷每個連通區域

把圖看成是一個鄰接表,然后從沒訪問過的點開始 DFS,把一個區域內的所有點標記為訪問過。每發現一個新未訪問的節點,就說明有一個新的連通分量。

Union-Find(并查集)

通過并查集把每個點合并成“祖宗節點”,合并所有連通的點,最后統計有多少個不同的祖宗節點,就是連通分量的數量。

我們下面會實現 DFS 方法,它更直觀易懂,特別適合初學者。

題解代碼分析(Swift 實現:DFS)

func countComponents(_ n: Int, _ edges: [[Int]]) -> Int {var graph = [Int: [Int]]()for edge in edges {graph[edge[0], default: []].append(edge[1])graph[edge[1], default: []].append(edge[0])}var visited = Set<Int>()var components = 0func dfs(_ node: Int) {if visited.contains(node) { return }visited.insert(node)for neighbor in graph[node, default: []] {dfs(neighbor)}}for i in 0..<n {if !visited.contains(i) {components += 1dfs(i)}}return components
}

題解代碼詳解

構建鄰接表

var graph = [Int: [Int]]()
for edge in edges {graph[edge[0], default: []].append(edge[1])graph[edge[1], default: []].append(edge[0])
}

這段代碼會把每一對連接關系存進字典,形成一個“誰連著誰”的列表。

DFS 深度優先搜索

func dfs(_ node: Int) {if visited.contains(node) { return }visited.insert(node)for neighbor in graph[node, default: []] {dfs(neighbor)}
}

從某個起點開始,一路訪問下去,把整個連通區域的點都標記為“訪問過”。

遍歷所有節點

for i in 0..<n {if !visited.contains(i) {components += 1dfs(i)}
}

每當我們發現一個還沒被訪問的點,就說明它是一個新連通分量的起點,我們就從它出發去搜索這個“朋友圈”。

示例測試及結果

示例 1

let count1 = countComponents(5, [[0, 1], [1, 2], [3, 4]])
print(count1) // 輸出:2

示例 2

let count2 = countComponents(4, [[0, 1], [2, 3]])
print(count2) // 輸出:2

示例 3

let count3 = countComponents(5, [[0, 1], [1, 2], [2, 3], [3, 4]])
print(count3) // 輸出:1

時間復雜度分析

  • 構建圖:O(E)
  • DFS 總遍歷所有節點和邊:O(N + E)
  • 總體時間復雜度:O(N + E),其中 N 是節點數,E 是邊數

空間復雜度分析

  • 圖鄰接表:O(N + E)
  • 訪問集合:O(N)
  • DFS 棧空間:O(N)
  • 總體空間復雜度:O(N + E)

總結

這道題非常適合作為圖算法入門練手題,掌握它你會收獲:

  • 如何從邊列表構建圖結構
  • 如何用 DFS 找出連通區域
  • 連通分量的概念實際是“有幾個不相交的圖”

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

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

相關文章

【劍指offer】棧 隊列

&#x1f4c1; JZ9 用兩個棧實現隊列一個棧in用作進元素&#xff0c;一個棧out用于出元素。當棧out沒有元素時&#xff0c;從in棧獲取數據&#xff0c;根據棧的特性&#xff0c;棧out的top元素一定是先進入的元素&#xff0c;因此當棧out使用pop操作時&#xff0c;一定時滿足隊…

GoView 低代碼數據可視化

純前端 分支&#xff1a; master &#x1f47b; 攜帶 后端 請求分支: master-fetch &#x1f4da; GoView 文檔 地址&#xff1a;https://www.mtruning.club/ 項目純前端-Demo 地址&#xff1a;https://vue.mtruning.club/ 項目帶后端-Demo 地址&#xff1a;https://demo.mtrun…

Spring Boot返回前端Long型丟失精度 后兩位 變成00

文章目錄一、前言二、問題描述2.1、問題背景2.2、問題示例三、解決方法3.1、將ID轉換為字符串3.2、使用JsonSerialize注解3.3、使用JsonFormat注解一、前言 在后端開發中&#xff0c;我們經常會遇到需要將ID作為標識符傳遞給前端的情況。當ID為long類型時&#xff0c;如果該ID…

計算機網絡實驗——無線局域網安全實驗

實驗1. WEP和WPA2-PSK實驗一、實驗目的驗證AP和終端與實現WEP安全機制相關的參數的配置過程。驗證AP和終端與實現WPA2-PSK安全機制相關的參數的配置過程。驗證終端與AP之間建立關聯的過程。驗證關閉端口的重新開啟過程。驗證屬于不同BSS的終端之間的數據傳輸過程。二、實驗任務…

【從零開始學Dify】大模型應用開發平臺Dify本地化部署

目錄Dify一、本地化部署1、安裝docker2、安裝Dify&#xff08;1&#xff09;拉取代碼到本地&#xff08;2&#xff09;docker部署&#xff08;3&#xff09;查看服務狀態&#xff08;4&#xff09;web端部署&#xff08;5&#xff09;登錄二、可能會出現的問題&#xff08;1&am…

LVGL應用和部署(和物理按鍵交互)

【 聲明&#xff1a;版權所有&#xff0c;歡迎轉載&#xff0c;請勿用于商業用途。 聯系信箱&#xff1a;feixiaoxing 163.com】屏幕除了顯示部分&#xff0c;還要去和其他外設進行交互&#xff0c;這是非常重要的一個處理方法。我們知道&#xff0c;不管是mcu&#xff0c;還是…

限流式保護器如何筑牢無人駕駛汽車充電站的安全防線

摘要&#xff1a; 隨著新能源汽車&#xff0c;尤其是無人駕駛車隊的快速發展&#xff0c;充電設施的安全可靠性至關重要。交流充電樁&#xff08;俗稱“慢充樁”&#xff09;作為重要的充電基礎設施&#xff0c;其末端回路的安全保護需滿足國家標準GB51348-2019的嚴格要求&…

專題:2025母嬰行業洞察報告|附60+份報告PDF匯總下載

原文鏈接&#xff1a;https://tecdat.cn/?p42908 全球母嬰市場正經歷結構性增長&#xff0c;一面是歐美成熟市場的品質消費升級&#xff0c;一面是東南亞、中東等新興市場的人口紅利釋放。2020至2026年&#xff0c;全球母嬰市場規模將從1859億美元增至3084億美元&#xff0c;年…

從零搭建多商戶商城系統源碼:技術棧、數據庫設計與接口規劃詳解

如今&#xff0c;多商戶商城系統已成為傳統零售轉型與新型電商平臺構建的關鍵利器。無論是打造像某寶、某東這樣的綜合型平臺&#xff0c;還是服務于垂直行業的獨立電商&#xff0c;一套高效、可擴展的多商戶商城系統源碼&#xff0c;往往決定著平臺的成敗。 今天&#xff0c;小…

在Docker中運行macOS的超方便體驗!

在數字化和開發人員快速迭代的今日&#xff0c;擁有一個便捷、高效的開發環境成為每個開發者夢寐以求的事情。特別是在需要操作多個系統、開發跨平臺應用時&#xff0c;調試和測試的便利性顯得尤為重要。今天為大家介紹的這款開源項目&#xff0c;正是一個解決此類問題的利器—…

Kettle導入Excel文件進數據庫時,數值發生錯誤的一種原因

1、問題描述及原因 在使用kettle讀取Excel文件、并導入數據庫時&#xff0c;需要讀取Excel中的數值、日期(或日期時間、時間)、文本這三種類型的列進來&#xff0c;發現讀取其中的數值時&#xff0c;讀取的數字就不對。 經調查&#xff0c;原因是&#xff0c;在“導出數據為E…

Windows安裝DevEco Studio

1. 概述 DevEco Studio是華為基于IDEA Community開源工具開發的一站式HarmonyOS應用及元服務開發平臺&#xff0c;為開發者提供代碼開發、編譯構建以及調測等功能 2. 運行環境要求 操作系統&#xff1a;Windows10 64位、Windows11 64位 內存&#xff1a;16GB及以上 硬盤&…

PLC框架-1.3.2 報文750控制匯川伺服的轉矩上下限

本文介紹1200PLC如何使用750報文設定伺服轉矩的上下限。 750號報文 PLC---->伺服 (控制) 伺服--->PLC (狀態) PZD1

Redis知識集合---思維導圖(持續更新中)

一、Redis中常見的數據類型有哪些&#xff1f;二、Redis為什么這么快&#xff1f;三、為什么Redis設計為單線程&#xff1f;6.0版本為何引入多線程&#xff1f;四、

mac m1安裝大模型工具vllm

1 更新系統環境 參考vllm官網文檔&#xff0c;vllm對apple m1平臺mac os, xcoder, clang有如下要求 OS: macOS Sonoma or later SDK: XCode 15.4 or later with Command Line Tools Compiler: Apple Clang > 15.0.0 在App Store更新macOS和XCoder&#xff0c;依據XCoder版本…

解鎖localtime:使用技巧與避坑指南

目錄 一、引言 1.1 背景與目的 1.2 localtime 函數簡介 二、localtime 函數詳解 2.1 函數原型與參數 2.2 返回值與 tm 結構體 2.3 基本使用示例 三、localtime 函數的缺陷剖析 3.1 多次調用同一共享區間導致錯誤 3.1.1 問題現象展示 3.1.2 原因深入分析 3.1.3 實際影…

鄭州機械設計研究所 -PHM產品序列概覽

1.設備狀態監測系統 動態信號監測很像是三個獨立通道&#xff0c;振動&#xff0c;轉速&#xff0c;然后高頻的某個頻帶。或者是同一個振動信號做的低頻和高頻兩個帶通&#xff0c;時域和頻域組圖。實時檢測&#xff0c;很明顯是24個時 -頻指標。 動態分析看起來像趨勢圖。 2.…

《棒壘球知道》奧運會的吉祥物是什么·棒球1號位

Olympic Mascots & Baseball/Softball Games History ?&#xff08;奧運吉祥物與棒壘球賽事全科普&#xff09;1984洛杉磯奧運會 / Los Angeles 1984Mascot: Sam the Eagle&#xff08;山姆鷹&#xff09;美國精神象征&#xff0c;紅白藍配色超吸睛&#xff01;Baseball/S…

【提高篇-基礎知識與編程環境:1、Linux系統終端中常用的文件與目錄操作命令】

Linux終端提供了豐富的命令來操作文件和目錄&#xff0c;以下簡單介紹一些常用的命令&#xff1a; 一、目錄操作命令 pwd - 顯示當前工作目錄 pwd #輸出當前所在目錄的絕對路徑 cd - 切換目錄 cd /path/to/directory # 切換到指定目錄 cd … # …

前端性能優化:從之理論到實踐的破局道

&#x1f680; 前端性能優化&#xff1a;從之理論到實踐的破局道 摘要&#xff1a;本文針對首屏加載、渲染卡頓等核心痛點&#xff0c;結合當前主流技術棧給出可落地的優化方案一、為什么你的頁面"又慢又卡"&#xff1f; 用戶真實體驗數據&#xff1a; 加載時間超過3…