美文网首页
Leetcode[547] Friend Circles

Leetcode[547] Friend Circles

作者: 耳可黄 | 来源:发表于2017-10-04 06:44 被阅读0次
Solution I. BFS (Time: O(N^2))
class Solution {
public:
    int findCircleNum(vector<vector<int>>& M) {
        int n = M.size();
        int count = 0;
        unordered_map<int, int> unvisited;
        for(int i = 0; i < n; i++){
            unvisited[i] = i;
        }
        while(!unvisited.empty()){
            auto it = unvisited.begin();
            int p = it->second;
            unvisited.erase(p);
            queue<int> circle;
            circle.push(p);
            while(!circle.empty()){
                p = circle.front();
                for(int i = 0; i < n; i++){
                    if(M[p][i] == 1 && unvisited.find(i) != unvisited.end()) {
                        circle.push(i);
                        unvisited.erase(i);
                    }
                }
                circle.pop();
            }
            count++;
        }
        return count;
    }  
};

Note: I used unordered_map here to easily erase entry by value. vector does not support this function

Union Find (Loop half matrix)
class Solution {
    
public:
    int findCircleNum(vector<vector<int>>& M) {
        int n = M.size();
        vector<int> P(n, -1);
        for(int i = 0; i < n; i++) {
            for(int j = i+1; j < n; j++) {
                if(M[i][j] == 1) {
                    union1(i, j, P);
                }
            }
        }
        int count = 0;
        for(int i = 0; i < n; i++) {
            if(P[i] == -1) count++;
        }
        return count;
    }
    
    int find(int i, vector<int>& P) {
        if(P[i] == -1) return i;
        return find(P[i], P);
    }
    
    void union1(int i, int j, vector<int>& P) {
        int pi = find(i, P);
        int pj = find(j, P);
        if(pi == pj) return;
        P[pi] = pj;
    }
};

Note: union is a reserved key in c++

相关文章

网友评论

      本文标题:Leetcode[547] Friend Circles

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