玩命加载中 . . .

547-省份数量


LeetCode 547. 省份数量

n 个城市,其中一些彼此相连,另一些没有相连。如果城市 a 与城市 b 直接相连,且城市 b 与城市 c 直接相连,那么城市 a 与城市 c 间接相连。

省份 是一组直接或间接相连的城市,组内不含其他没有相连的城市。

给你一个 n x n 的矩阵 isConnected ,其中 isConnected[i][j] = 1 表示第 i 个城市和第 j 个城市直接相连,而 isConnected[i][j] = 0 表示二者不直接相连。

返回矩阵中 省份 的数量。

示例 1:

img

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

method 1: DFS

void dfs(int cur, vector<vector<int>>& grid, vector<bool>& used) {
    used[cur] = true;
    for (int i = 0; i < grid.size(); i++) {
        if (grid[cur][i] && !used[i]) {
            dfs(i, grid, used);
        }
    }
}
int findCircleNum(vector<vector<int>>& isConnected) {
    int n = isConnected.size();
    vector<bool> used(n, false);
    int cnt = 0;
    for (int i = 0; i < n; i++) {
        if (!used[i]) {
            cnt++;
            dfs(i, isConnected, used);
        }
    }
    return cnt;
}

method 2: BFS

void bfs(int node, vector<vector<int>>& isConnected, vector<bool>& used) {
    queue<int> q;
    q.push(node);
    while (!q.empty()) {
        int x = q.front();
        q.pop();
        used[x] = true;
        for (int i = 0; i < isConnected.size(); i++) {
            if (isConnected[x][i] && !used[i]) {
                q.push(i);
            }
        }
    }
}
int findCircleNum(vector<vector<int>>& isConnected) {
    int n = isConnected.size();
    vector<bool> used(n, false);
    int cnt = 0;
    for (int i = 0; i < n; i++) {
        if (!used[i]) {
            cnt++;
            bfs(i, isConnected, used);
        }
    }
    return cnt;
}

method 3: 并查集

int find(vector<int>& fa, int x) {
    if (x != fa[x]) {
        fa[x] = find(fa, fa[x]);
    }
    return fa[x];
}
void merge(vector<int>& fa, int i, int j) {
    fa[find(fa, i)] = find(fa, j);
}
int findCircleNum(vector<vector<int>>& isConnected) {
    int n = isConnected.size();
    vector<int> fa(n);
    for (int i = 0; i < n; i++) {
        fa[i] = i;
    }
    for (int i = 0; i < n; i++) {
        for (int j = i + 1; j < n; j++) {
            if (isConnected[i][j]) {
                merge(fa, i, j);
            }
        }
    }
    int cnt = 0;
    for (int i = 0; i < n; i++) {
        if (fa[i] == i) cnt++;
    }
    return cnt;
}

文章作者: kunpeng
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 kunpeng !
  目录