美文网首页
剑指 Offer II 116. 省份数量

剑指 Offer II 116. 省份数量

作者: 邦_ | 来源:发表于2022-08-09 12:19 被阅读0次

并查集。感觉用quick find会比较好点

class Solution {
   
   class MyUnionFind {
    var parents = [Int]()
    var ranks : [Int]
    
    init(_ capacity:Int){
        
        ranks = Array.init(repeating: 1, count: capacity)
        for i in 0..<capacity {
            parents.append(i)
        }

    }
    
    func find(_ v:Int)-> Int{
    
        var temp = v
        //路径减半
        while parents[temp] != temp {
            parents[temp] = parents[parents[temp]]
            temp = parents[temp]
        }
        return temp
    }
    
    func union(_ v1:Int,_ v2:Int){
        
        let p1 = find(v1)
        let p2 = find(v2)
        if p1 == p2 {
            return
        }
        let r1 = ranks[p1]
        let r2 = ranks[p2]
        if r1 < r2 {
            parents[p1] = p2
        }else if r1 > r2 {
            parents[p2] = p1
        }else {
            parents[p1] = p2
            ranks[p2] += 1
        }
        
    }
    func isSame(_ v1:Int,_ v2:Int)-> Bool{
        return find(v1) == find(v2)
        
    }
    
}





   func findCircleNum(_ isConnected: [[Int]]) -> Int {
        
    let len = isConnected.count
    let uf = MyUnionFind(len)
        for i in 0..<len {
            for j in 0..<len {
                if i == j {
                    continue
                }
                if isConnected[i][j] == 1 {
                    uf.union(i,j)
                }
            }
            
        }
        var dict = Set<Int>()
        for i in uf.parents {
            dict.insert(uf.find(i))
        }
        return dict.count
    }
}









相关文章

网友评论

      本文标题:剑指 Offer II 116. 省份数量

      本文链接:https://www.haomeiwen.com/subject/dnwpwrtx.html