【華為機試】547. 省份數量

文章目錄

  • 547. 省份數量
    • 描述
    • 示例 1
    • 示例 2
    • 提示
    • 解題思路
      • 核心分析
      • 問題轉化
      • 算法選擇策略
        • 1. 深度優先搜索 (DFS)
        • 2. 廣度優先搜索 (BFS)
        • 3. 并查集 (Union-Find)
      • 算法實現詳解
        • 方法一:深度優先搜索 (DFS)
        • 方法二:廣度優先搜索 (BFS)
        • 方法三:并查集 (Union-Find)
      • 算法選擇
        • 1. 深度優先搜索 (DFS)
        • 2. 廣度優先搜索 (BFS)
        • 3. 并查集 (Union-Find)
      • 數學證明
        • 并查集正確性證明
        • 時間復雜度分析
      • 執行流程圖
      • 算法可視化
      • 實際應用
      • 算法優化技巧
        • 1. 內存優化
        • 2. 早期終止
        • 3. 對稱性利用
      • 擴展思考
      • 相關問題
      • 測試用例設計
      • 性能對比
      • 常見錯誤
      • 總結
      • 算法流程圖
      • 詳細解題步驟
        • 方法一:深度優先搜索 (DFS)
        • 方法二:廣度優先搜索 (BFS)
        • 方法三:并查集 (Union-Find)
      • 復雜度分析
      • 邊界情況處理
      • 優化技巧
    • 完整題解代碼

547. 省份數量

描述

有 n 個城市,其中一些彼此相連,另一些沒有相連。如果城市 a 與城市 b 直接相連,且城市 b 與城市 c 直接相連,那么城市 a 與城市 c 間接相連。

省份 是一組直接或間接相連的城市,組內不含其他沒有相連的城市。

給你一個 n x n 的矩陣 isConnected ,其中 isConnected[i][j] = 1 表示第 i 個城市和第 j 個城市直接相連,而 isConnected[i][j] = 0 表示二者不直接相連。

返回矩陣中 省份 的數量。

示例 1

在這里插入圖片描述

輸入:isConnected = [[1,1,0],[1,1,0],[0,0,1]]
輸出:2

示例 2

在這里插入圖片描述

輸入:isConnected = [[1,0,0],[0,1,0],[0,0,1]]
輸出:3

提示

  • 1 <= n <= 200
  • n == isConnected.length
  • n == isConnected[i].length
  • isConnected[i][j] 為 1 或 0
  • isConnected[i][i] == 1
  • isConnected[i][j] == isConnected[j][i]

解題思路

核心分析

這道題是一個經典的圖論連通性問題。核心思想是計算無向圖中連通分量的數量。

問題本質:給定一個無向圖的鄰接矩陣,計算圖中連通分量的個數。

關鍵洞察

  • 每個城市是一個節點,城市間的連接關系構成邊
  • 省份就是連通分量,即相互可達的節點集合
  • 可以通過遍歷算法(DFS/BFS)或并查集來求解

問題轉化

原始問題:計算n個城市中省份的數量

圖論轉化

  1. 將城市抽象為圖中的節點
  2. 將城市間的連接關系抽象為圖中的邊
  3. 省份數量 = 連通分量數量

數學建模

  • 節點集合:V = {0, 1, 2, …, n-1}
  • 邊集合:E = {(i, j) | isConnected[i][j] = 1}
  • 目標:計算圖G(V, E)中連通分量的數量

算法選擇策略

1. 深度優先搜索 (DFS)
  • 適用場景:連通性問題,需要遍歷所有可達節點
  • 優勢:實現簡單,遞歸清晰,空間效率高
  • 劣勢:可能棧溢出,不適合極大數據量
2. 廣度優先搜索 (BFS)
  • 適用場景:連通性問題,需要層次遍歷
  • 優勢:避免棧溢出,適合大數據量
  • 劣勢:需要隊列空間,實現稍復雜
3. 并查集 (Union-Find)
  • 適用場景:動態連通性問題,需要頻繁合并操作
  • 優勢:支持動態操作,理論復雜度最優
  • 劣勢:實現復雜,常數項較大

算法實現詳解

方法一:深度優先搜索 (DFS)

核心思想:從每個未訪問的節點開始,遞歸訪問所有可達節點

算法步驟

  1. 初始化訪問數組visited,記錄每個節點是否被訪問
  2. 遍歷所有節點,對每個未訪問的節點:
    • 調用DFS函數訪問該節點及其所有可達節點
    • 連通分量數量加1
  3. DFS函數實現:
    • 標記當前節點為已訪問
    • 遍歷所有與當前節點相連的節點
    • 對每個未訪問的相連節點遞歸調用DFS

代碼實現

func findCircleNumDFS(isConnected [][]int) int {n := len(isConnected)if n == 0 {return 0}visited := make([]bool, n)count := 0for i := 0; i < n; i++ {if !visited[i] {dfs(isConnected, visited, i)count++}}return count
}func dfs(isConnected [][]int, visited []bool, city int) {visited[city] = truefor nextCity := 0; nextCity < len(isConnected); nextCity++ {if isConnected[city][nextCity] == 1 && !visited[nextCity] {dfs(isConnected, visited, nextCity)}}
}

時間復雜度分析

  • 每個節點最多被訪問一次:O(n)
  • 每次訪問需要遍歷所有相鄰節點:O(n)
  • 總時間復雜度:O(n2)

空間復雜度分析

  • 訪問數組:O(n)
  • 遞歸調用棧深度:O(n)
  • 總空間復雜度:O(n)
方法二:廣度優先搜索 (BFS)

核心思想:使用隊列進行層次遍歷,訪問所有可達節點

算法步驟

  1. 初始化訪問數組和隊列
  2. 遍歷所有節點,對每個未訪問的節點:
    • 將節點加入隊列
    • 標記為已訪問
    • 連通分量數量加1
    • 執行BFS遍歷
  3. BFS函數實現:
    • 從隊列中取出節點
    • 遍歷所有與當前節點相連的節點
    • 將未訪問的相連節點加入隊列并標記為已訪問

代碼實現

func findCircleNumBFS(isConnected [][]int) int {n := len(isConnected)if n == 0 {return 0}visited := make([]bool, n)count := 0for i := 0; i < n; i++ {if !visited[i] {bfs(isConnected, visited, i)count++}}return count
}func bfs(isConnected [][]int, visited []bool, startCity int) {queue := []int{startCity}visited[startCity] = truefor len(queue) > 0 {city := queue[0]queue = queue[1:]for nextCity := 0; nextCity < len(isConnected); nextCity++ {if isConnected[city][nextCity] == 1 && !visited[nextCity] {visited[nextCity] = truequeue = append(queue, nextCity)}}}
}

時間復雜度:O(n2)
空間復雜度:O(n)

方法三:并查集 (Union-Find)

核心思想:使用并查集維護連通性,通過合并操作統計連通分量

算法步驟

  1. 初始化并查集,每個節點自成一個集合
  2. 遍歷鄰接矩陣,對每個連接關系:
    • 合并相連的兩個節點到同一集合
  3. 統計最終集合的數量

并查集優化

  • 路徑壓縮:在查找時壓縮路徑,減少后續查找時間
  • 按秩合并:將較小的樹合并到較大的樹上,保持樹的平衡

代碼實現

type UnionFind struct {parent []intrank   []intcount  int
}func NewUnionFind(n int) *UnionFind {parent := make([]int, n)rank := make([]int, n)for i := 0; i < n; i++ {parent[i] = irank[i] = 1}return &UnionFind{parent: parent,rank:   rank,count:  n,}
}func (uf *UnionFind) Find(x int) int {if uf.parent[x] != x {uf.parent[x] = uf.Find(uf.parent[x]) // 路徑壓縮}return uf.parent[x]
}func (uf *UnionFind) Union(x, y int) {rootX := uf.Find(x)rootY := uf.Find(y)if rootX == rootY {return}// 按秩合并if uf.rank[rootX] < uf.rank[rootY] {uf.parent[rootX] = rootY} else if uf.rank[rootX] > uf.rank[rootY] {uf.parent[rootY] = rootX} else {uf.parent[rootY] = rootXuf.rank[rootX]++}uf.count--
}func (uf *UnionFind) Count() int {return uf.count
}

時間復雜度:O(n2 × α(n)),其中α(n)是阿克曼函數的反函數
空間復雜度:O(n)

算法選擇

1. 深度優先搜索 (DFS)
  • 時間復雜度:O(n2),其中 n 是城市數量
  • 空間復雜度:O(n),遞歸調用棧的深度
  • 適用場景:適合處理連通性問題
2. 廣度優先搜索 (BFS)
  • 時間復雜度:O(n2)
  • 空間復雜度:O(n),隊列的空間
  • 適用場景:適合處理連通性問題,避免遞歸棧溢出
3. 并查集 (Union-Find)
  • 時間復雜度:O(n2 × α(n)),其中 α(n) 是阿克曼函數的反函數
  • 空間復雜度:O(n)
  • 適用場景:適合處理動態連通性問題

數學證明

并查集正確性證明

定理:并查集算法能正確計算連通分量的數量。

證明

  1. 初始化正確性

    • 初始時每個節點自成一個集合
    • 集合數量等于節點數量
  2. 合并操作正確性

    • 每次合并操作將兩個連通分量合并為一個
    • 集合數量減少1
  3. 最終結果正確性

    • 所有相連的節點都在同一集合中
    • 不同連通分量的節點在不同集合中
    • 集合數量等于連通分量數量
時間復雜度分析

定理:并查集算法的時間復雜度為O(n2 × α(n))。

證明

  • 每個節點最多參與n次合并操作
  • 每次合并操作的時間復雜度為O(α(n))
  • 總時間復雜度為O(n2 × α(n))

執行流程圖

開始: 輸入鄰接矩陣
選擇算法
DFS算法
BFS算法
并查集算法
初始化訪問數組
遍歷所有節點
節點是否已訪問?
調用DFS函數
繼續下一個節點
連通分量數量+1
是否遍歷完成?
返回結果
初始化訪問數組和隊列
遍歷所有節點
節點是否已訪問?
調用BFS函數
繼續下一個節點
連通分量數量+1
是否遍歷完成?
初始化并查集
遍歷鄰接矩陣
是否存在連接?
合并兩個節點
繼續下一個元素
是否遍歷完成?
返回集合數量
結束

算法可視化

DFS遍歷過程
圖結構
鄰接矩陣
訪問城市0
訪問城市1
連通分量1完成
訪問城市2
連通分量2完成
城市1
城市0
城市2
1 1 0
1 1 0
0 0 1

實際應用

  1. 社交網絡分析:計算朋友圈的數量
  2. 網絡拓撲分析:計算網絡中的連通區域
  3. 地理信息系統:計算地理區域的連通性
  4. 電路設計:分析電路的連通性
  5. 生物信息學:分析蛋白質相互作用網絡

算法優化技巧

1. 內存優化
// 使用位運算優化訪問數組
visited := make([]uint64, (n+63)/64)
2. 早期終止
// 如果所有節點都已訪問,可以提前終止
if count == n {return 1
}
3. 對稱性利用
// 利用鄰接矩陣的對稱性,只遍歷上三角
for i := 0; i < n; i++ {for j := i + 1; j < n; j++ {if isConnected[i][j] == 1 {// 處理連接關系}}
}

擴展思考

  1. 有向圖:如果是有向圖,如何計算強連通分量?
  2. 加權圖:如果邊有權重,如何定義連通性?
  3. 動態圖:如果圖結構動態變化,如何維護連通性?
  4. 大規模圖:對于超大規模圖,如何優化算法?
  5. 并行算法:如何設計并行版本的連通分量算法?

相關問題

  1. 200. 島嶼數量:二維網格中的連通分量問題
  2. 130. 被圍繞的區域:連通分量的邊界處理
  3. 399. 除法求值:帶權圖的連通性問題
  4. 684. 冗余連接:并查集在最小生成樹中的應用
  5. 685. 冗余連接 II:有向圖的連通性問題

測試用例設計

// 基礎測試用例
isConnected1 := [][]int{{1, 1, 0},{1, 1, 0},{0, 0, 1},
}
expected1 := 2isConnected2 := [][]int{{1, 0, 0},{0, 1, 0},{0, 0, 1},
}
expected2 := 3// 邊界測試
isConnected3 := [][]int{{1}}
expected3 := 1var isConnected4 [][]int
expected4 := 0// 極值測試
isConnected5 := [][]int{{1, 1, 1},{1, 1, 1},{1, 1, 1},
}
expected5 := 1// 復雜情況
isConnected6 := [][]int{{1, 0, 0, 1},{0, 1, 1, 0},{0, 1, 1, 1},{1, 0, 1, 1},
}
expected6 := 1

性能對比

算法時間復雜度空間復雜度常數項適用場景
DFSO(n2)O(n)一般情況
BFSO(n2)O(n)中等大數據量
并查集O(n2 × α(n))O(n)動態連通性

常見錯誤

  1. 訪問標記錯誤:忘記標記節點為已訪問
  2. 遞歸終止錯誤:遞歸函數沒有正確的終止條件
  3. 數組越界:訪問鄰接矩陣時越界
  4. 并查集初始化錯誤:parent數組初始化不正確
  5. 邊界處理錯誤:沒有正確處理空矩陣或單個節點

總結

省份數量 是一道經典的圖論連通性問題,核心在于理解連通分量的概念和計算算法。

最優解法DFS或BFS算法,具有以下優勢:

  1. 時間復雜度合理:O(n2)
  2. 實現簡單:遞歸或隊列遍歷
  3. 空間效率高:只需要O(n)額外空間
  4. 應用廣泛:是圖遍歷的經典模板題

這道題體現了圖論算法中的重要思想:

  • 連通性分析:通過遍歷確定節點間的可達性
  • 訪問標記:避免重復訪問,提高算法效率
  • 問題建模:將實際問題抽象為圖論問題

并查集算法雖然理論復雜度最優,但在實際應用中,由于常數項較大,對于中等規模的問題,DFS/BFS算法往往更實用。

算法流程圖

開始
初始化訪問數組 visited
遍歷所有城市 i
城市 i 是否已訪問?
DFS/BFS 遍歷連通分量
繼續下一個城市
省份數量 + 1
是否遍歷完所有城市?
返回省份數量
結束
標記當前城市為已訪問
遍歷所有相鄰城市
相鄰城市是否已訪問?
遞歸訪問相鄰城市
繼續下一個相鄰城市
是否遍歷完所有相鄰城市?
返回

詳細解題步驟

方法一:深度優先搜索 (DFS)
  1. 初始化:創建訪問數組 visited,記錄每個城市是否被訪問過
  2. 遍歷城市:從每個未訪問的城市開始進行DFS
  3. DFS過程
    • 標記當前城市為已訪問
    • 遍歷所有與當前城市相連的城市
    • 對每個未訪問的相連城市遞歸調用DFS
  4. 計數:每次開始新的DFS時,省份數量加1
方法二:廣度優先搜索 (BFS)
  1. 初始化:創建訪問數組和隊列
  2. 遍歷城市:從每個未訪問的城市開始進行BFS
  3. BFS過程
    • 將當前城市加入隊列
    • 標記為已訪問
    • 從隊列中取出城市,遍歷其所有相連城市
    • 將未訪問的相連城市加入隊列
  4. 計數:每次開始新的BFS時,省份數量加1
方法三:并查集 (Union-Find)
  1. 初始化:創建并查集,每個城市自成一個集合
  2. 合并操作:遍歷鄰接矩陣,將相連的城市合并到同一集合
  3. 統計集合:統計最終有多少個不同的集合

復雜度分析

方法時間復雜度空間復雜度優勢劣勢
DFSO(n2)O(n)實現簡單,遞歸清晰可能棧溢出
BFSO(n2)O(n)避免棧溢出需要隊列
并查集O(n2 × α(n))O(n)適合動態連通性實現復雜

邊界情況處理

  1. 空矩陣:返回0
  2. 單個城市:返回1
  3. 所有城市都不相連:返回n
  4. 所有城市都相連:返回1

優化技巧

  1. 提前返回:如果所有城市都已訪問,可以提前結束
  2. 對稱性利用:由于是無向圖,鄰接矩陣是對稱的
  3. 內存優化:使用位運算優化訪問數組的存儲

完整題解代碼

package mainimport ("fmt"
)// 方法一:深度優先搜索 (DFS)
// 時間復雜度:O(n2),空間復雜度:O(n)
func findCircleNumDFS(isConnected [][]int) int {n := len(isConnected)if n == 0 {return 0}// 訪問數組,記錄每個城市是否被訪問過visited := make([]bool, n)count := 0// 從每個未訪問的城市開始DFSfor i := 0; i < n; i++ {if !visited[i] {dfs(isConnected, visited, i)count++}}return count
}// DFS輔助函數
func dfs(isConnected [][]int, visited []bool, city int) {visited[city] = true// 遍歷所有與當前城市相連的城市for nextCity := 0; nextCity < len(isConnected); nextCity++ {if isConnected[city][nextCity] == 1 && !visited[nextCity] {dfs(isConnected, visited, nextCity)}}
}// 方法二:廣度優先搜索 (BFS)
// 時間復雜度:O(n2),空間復雜度:O(n)
func findCircleNumBFS(isConnected [][]int) int {n := len(isConnected)if n == 0 {return 0}visited := make([]bool, n)count := 0// 從每個未訪問的城市開始BFSfor i := 0; i < n; i++ {if !visited[i] {bfs(isConnected, visited, i)count++}}return count
}// BFS輔助函數
func bfs(isConnected [][]int, visited []bool, startCity int) {queue := []int{startCity}visited[startCity] = truefor len(queue) > 0 {city := queue[0]queue = queue[1:]// 遍歷所有與當前城市相連的城市for nextCity := 0; nextCity < len(isConnected); nextCity++ {if isConnected[city][nextCity] == 1 && !visited[nextCity] {visited[nextCity] = truequeue = append(queue, nextCity)}}}
}// 方法三:并查集 (Union-Find)
// 時間復雜度:O(n2 × α(n)),空間復雜度:O(n)
func findCircleNumUnionFind(isConnected [][]int) int {n := len(isConnected)if n == 0 {return 0}// 初始化并查集uf := NewUnionFind(n)// 遍歷鄰接矩陣,合并相連的城市for i := 0; i < n; i++ {for j := i + 1; j < n; j++ { // 利用對稱性,只遍歷上三角if isConnected[i][j] == 1 {uf.Union(i, j)}}}return uf.Count()
}// 并查集結構
type UnionFind struct {parent []intrank   []intcount  int
}// 創建新的并查集
func NewUnionFind(n int) *UnionFind {parent := make([]int, n)rank := make([]int, n)for i := 0; i < n; i++ {parent[i] = irank[i] = 1}return &UnionFind{parent: parent,rank:   rank,count:  n,}
}// 查找根節點(路徑壓縮)
func (uf *UnionFind) Find(x int) int {if uf.parent[x] != x {uf.parent[x] = uf.Find(uf.parent[x]) // 路徑壓縮}return uf.parent[x]
}// 合并兩個集合(按秩合并)
func (uf *UnionFind) Union(x, y int) {rootX := uf.Find(x)rootY := uf.Find(y)if rootX == rootY {return}// 按秩合并if uf.rank[rootX] < uf.rank[rootY] {uf.parent[rootX] = rootY} else if uf.rank[rootX] > uf.rank[rootY] {uf.parent[rootY] = rootX} else {uf.parent[rootY] = rootXuf.rank[rootX]++}uf.count--
}// 返回集合數量
func (uf *UnionFind) Count() int {return uf.count
}// 方法四:優化的DFS(使用棧避免遞歸)
// 時間復雜度:O(n2),空間復雜度:O(n)
func findCircleNumDFSIterative(isConnected [][]int) int {n := len(isConnected)if n == 0 {return 0}visited := make([]bool, n)count := 0for i := 0; i < n; i++ {if !visited[i] {dfsIterative(isConnected, visited, i)count++}}return count
}// 迭代式DFS
func dfsIterative(isConnected [][]int, visited []bool, startCity int) {stack := []int{startCity}visited[startCity] = truefor len(stack) > 0 {city := stack[len(stack)-1]stack = stack[:len(stack)-1]for nextCity := 0; nextCity < len(isConnected); nextCity++ {if isConnected[city][nextCity] == 1 && !visited[nextCity] {visited[nextCity] = truestack = append(stack, nextCity)}}}
}// 測試函數
func main() {// 測試用例1:示例1isConnected1 := [][]int{{1, 1, 0},{1, 1, 0},{0, 0, 1},}fmt.Println("測試用例1:")fmt.Printf("輸入: %v\n", isConnected1)fmt.Printf("DFS結果: %d\n", findCircleNumDFS(isConnected1))fmt.Printf("BFS結果: %d\n", findCircleNumBFS(isConnected1))fmt.Printf("并查集結果: %d\n", findCircleNumUnionFind(isConnected1))fmt.Printf("迭代DFS結果: %d\n", findCircleNumDFSIterative(isConnected1))fmt.Println("期望結果: 2")fmt.Println()// 測試用例2:示例2isConnected2 := [][]int{{1, 0, 0},{0, 1, 0},{0, 0, 1},}fmt.Println("測試用例2:")fmt.Printf("輸入: %v\n", isConnected2)fmt.Printf("DFS結果: %d\n", findCircleNumDFS(isConnected2))fmt.Printf("BFS結果: %d\n", findCircleNumBFS(isConnected2))fmt.Printf("并查集結果: %d\n", findCircleNumUnionFind(isConnected2))fmt.Printf("迭代DFS結果: %d\n", findCircleNumDFSIterative(isConnected2))fmt.Println("期望結果: 3")fmt.Println()// 測試用例3:所有城市相連isConnected3 := [][]int{{1, 1, 1},{1, 1, 1},{1, 1, 1},}fmt.Println("測試用例3 (所有城市相連):")fmt.Printf("輸入: %v\n", isConnected3)fmt.Printf("DFS結果: %d\n", findCircleNumDFS(isConnected3))fmt.Printf("BFS結果: %d\n", findCircleNumBFS(isConnected3))fmt.Printf("并查集結果: %d\n", findCircleNumUnionFind(isConnected3))fmt.Printf("迭代DFS結果: %d\n", findCircleNumDFSIterative(isConnected3))fmt.Println("期望結果: 1")fmt.Println()// 測試用例4:單個城市isConnected4 := [][]int{{1}}fmt.Println("測試用例4 (單個城市):")fmt.Printf("輸入: %v\n", isConnected4)fmt.Printf("DFS結果: %d\n", findCircleNumDFS(isConnected4))fmt.Printf("BFS結果: %d\n", findCircleNumBFS(isConnected4))fmt.Printf("并查集結果: %d\n", findCircleNumUnionFind(isConnected4))fmt.Printf("迭代DFS結果: %d\n", findCircleNumDFSIterative(isConnected4))fmt.Println("期望結果: 1")fmt.Println()// 測試用例5:空矩陣var isConnected5 [][]intfmt.Println("測試用例5 (空矩陣):")fmt.Printf("輸入: %v\n", isConnected5)fmt.Printf("DFS結果: %d\n", findCircleNumDFS(isConnected5))fmt.Printf("BFS結果: %d\n", findCircleNumBFS(isConnected5))fmt.Printf("并查集結果: %d\n", findCircleNumUnionFind(isConnected5))fmt.Printf("迭代DFS結果: %d\n", findCircleNumDFSIterative(isConnected5))fmt.Println("期望結果: 0")fmt.Println()// 測試用例6:復雜情況isConnected6 := [][]int{{1, 0, 0, 1},{0, 1, 1, 0},{0, 1, 1, 1},{1, 0, 1, 1},}fmt.Println("測試用例6 (復雜情況):")fmt.Printf("輸入: %v\n", isConnected6)fmt.Printf("DFS結果: %d\n", findCircleNumDFS(isConnected6))fmt.Printf("BFS結果: %d\n", findCircleNumBFS(isConnected6))fmt.Printf("并查集結果: %d\n", findCircleNumUnionFind(isConnected6))fmt.Printf("迭代DFS結果: %d\n", findCircleNumDFSIterative(isConnected6))fmt.Println("期望結果: 1")
}

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

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

相關文章

09_Spring Boot 整合 Freemarker 模板引擎的坑

09_Spring Boot 整合 Freemarker 模板引擎的坑 1.背景&#xff1a; springboot 版本&#xff1a;3.0.2 2. 引入依賴 在 pom.xml 中添加&#xff1a; <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web<…

十七、【Linux系統yum倉庫管理】替換阿里源、搭建本地yum源

替換阿里源、搭建本地yum源本章學習目標內容簡介阿里外網源核心功能本地yum核心功能操作演示替換阿里外網源備份原有yum源清理沖突配置下載阿里源配置文件添加EPEL擴展源清理緩存重建索引驗證源狀態測試安裝軟件使用鏡像搭建本地倉庫準備ISO鏡像創建掛載點目錄掛載iso文件驗證掛…

家庭網絡怎么進行公網IP獲取,及內網端口映射外網訪問配置,附無公網IP提供互聯網連接方案

在家庭網絡中&#xff0c;我們常常需要通過公網IP來訪問內網中的設備&#xff0c;比如家庭NAS、Web服務器或監控攝像頭。要實現這個目標&#xff0c;首先要確保你的網絡具有一個可用的公網IP&#xff0c;然后通過路由器配置端口映射&#xff08;Port Forwarding&#xff09;。如…

(LeetCode 面試經典 150 題 ) 128. 最長連續序列 (哈希表)

題目&#xff1a;128. 最長連續序列 思路&#xff1a;哈希表&#xff0c;時間復雜度0(n)。 用集合set來實現哈希表的功能&#xff0c;記錄所有出現的元素。然后遍歷元素&#xff0c;細節看注釋。 C版本&#xff1a; class Solution { public:int longestConsecutive(vector&…

Altera Quartus:BAT批處理實現一鍵sof文件轉換為jic文件

sof文件是Quartus編譯默認生成的程序文件&#xff0c;用于通過JTAG口下載到FPGA內部RAM&#xff0c;斷電程序會丟失&#xff0c;jic文件是用于固化到外部Flash中的程序文件&#xff0c;斷電程序不會丟失。本文介紹如何通過批處理文件實現sof到jic的一鍵自動化轉換。 Quartus工程…

基于單片機嬰兒床/嬰兒搖籃/嬰兒車設計/嬰兒監護系統

傳送門 &#x1f449;&#x1f449;&#x1f449;&#x1f449;其他作品題目速選一覽表 &#x1f449;&#x1f449;&#x1f449;&#x1f449;其他作品題目功能速覽 概述 本設計實現了一種基于單片機的多功能智能嬰兒監護系統&#xff0c;集成于嬰兒床、搖籃或嬰兒車中…

Typora + 七牛云圖床終極配置教程

本文是一份超詳細的 Typora 七牛云圖床配置指南&#xff0c;旨在幫助你實現圖片“即插即用”的順滑寫作體驗。我們將一步步完成所有配置&#xff0c;并特別針對配置過程中最常見的三個錯誤&#xff1a;ENOTFOUND (找不到服務器)、401 (無權訪問) 和 Document not found (文件不…

高性能熔斷限流實現:Spring Cloud Gateway 在電商系統的實戰優化

一、為什么需要高性能熔斷限流&#xff1f; 在電商系統中&#xff0c;尤其是大促期間&#xff0c;系統面臨的流量可能是平時的數十倍甚至上百倍。 這樣的場景下&#xff0c;熔斷限流不再是可選功能&#xff0c;而是保障系統穩定的生命線。傳統方案的問題&#xff1a; 限流精度不…

計算機網絡1.1:計算機網絡在信息時代的作用

計算機網絡已由一種通信基礎設施發展成為一種重要的信息服務基礎設施。計算機網絡已經像水、電、煤氣這些基礎設施一樣&#xff0c;成為我們生活中不可或缺的一部分。

Component cannot be used as a JSX component

今天在使用 React Ts&#xff0c;使用 react-icons 這個庫的時候&#xff0c;遇到了這個問題&#xff1a;原因用一句話概括就是 Ts 的版本太低了&#xff01; 我的 package.json&#xff1a; {"name": "frontend","version": "0.1.0"…

Centos安裝最新docker以及ubuntu安裝docker

Centos安裝最新版本docker1.更新阿里源,更新之前先做備份mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup更新阿里源wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo2.運行 yum makecache 生成緩存…

網絡基礎15-16:MSTP +VRRP綜合實驗

MSTP 、VRRP綜合實驗&#xff0c;MSTP涵蓋根橋選舉、邊緣端口、BPDU 保護、根保護、TC 保護 等功能驗證。一、實驗拓撲與設備規劃核心層&#xff1a;LSW1&#xff08;VLAN10 根橋、VLAN20 備份根&#xff09;、LSW2&#xff08;VLAN20 根橋、VLAN10 備份根&#xff09;。接入層…

nvm安裝詳細教程、鏡像、環境變量(安裝node.js,npm,nvm)

一、什么是nodejs、nvm、npm 1、node.js 角色&#xff1a;JavaScript 的運行時環境&#xff08;runtime&#xff09;。 作用&#xff1a;讓 JavaScript 脫離瀏覽器&#xff0c;直接在服務器或本地運行&#xff08;比如用 node app.js 執行代碼&#xff09;。 包含&#xff1…

【JS】獲取元素寬高(例如div)

文章目錄基礎用法基礎用法 高度類型選擇&#xff08;寬度同理&#xff09;&#xff1a; 屬性描述offsetHeight包含邊框內邊距內容clientHeight包含內邊距內容&#xff08;不包含邊框&#xff09;scrollHeight包含滾動內容的全高&#xff08;含隱藏部分&#xff09; JS可使用g…

Kubernetes(k8s)中命令行查看Pod所屬控制器之方法總結

在Kubernetes中&#xff0c;可以通過以下方法查看Pod所屬的控制器&#xff1a;方法1&#xff1a;使用 kubectl describe pod命令kubectl describe pod <pod name>Events:Type Reason Age From Message---- ------ ---- ---- …

Zabbix 企業級高級應用

目錄 一、Zabbix 監控基礎與核心價值 二、網絡自動發現&#xff1a;批量主機自動化管理 &#xff08;一&#xff09;網絡自動發現的核心能力與局限 &#xff08;二&#xff09;網絡自動發現完整流程 &#xff08;三&#xff09;網絡自動發現配置步驟 1. 客戶端&#xff0…

行業分類表sql

1.創建行業表行業信息表(hy_industries)名類型長度小數點Not Null虛擬鍵默認值注釋industries_idintTRUEFALSETRUE行業IDindustry_codevarchar5FALSEFALSEFALSE行業編碼industry_namevarchar100FALSEFALSEFALSE行業名稱parent_idvarchar50FALSEFALSEFALSE父級行業ID(頂級為NULL…

PPIO × Lemon AI:一鍵解鎖全流程自動化開發能力

傳統開發需手動編寫代碼、調試及測試&#xff0c;耗時且依賴技術能力。AI Agent 可以幫助開發者進行高效開發&#xff0c;從需求理解到代碼生成、測試、部署一站式完成。Lemon AI是一款開源的通用智能體&#xff0c;能夠實現從需求計劃到成果交付全流程自動化。它可以在虛擬環境…

基于單片機無線防丟/兒童防丟報警器

傳送門 &#x1f449;&#x1f449;&#x1f449;&#x1f449;其他作品題目速選一覽表 &#x1f449;&#x1f449;&#x1f449;&#x1f449;其他作品題目功能速覽 概述 本設計實現了一種基于單片機的無線防丟報警系統&#xff0c;主要用于防止貴重物品&#xff08;如…

50天50個小項目 (Vue3 + Tailwindcss V4) ? | NotesApp(便簽筆記組件)

&#x1f4c5; 我們繼續 50 個小項目挑戰&#xff01;—— NotesApp組件 倉庫地址&#xff1a;https://github.com/SunACong/50-vue-projects 項目預覽地址&#xff1a;https://50-vue-projects.vercel.app/。 使用 Vue 3 的 Composition API 搭配 TailwindCSS 和 marked 庫&…