美文网首页
LeetCode547. Friend Circles

LeetCode547. Friend Circles

作者: 24K纯帅豆 | 来源:发表于2019-05-24 16:00 被阅读0次

1、题目链接

https://leetcode.com/problems/friend-circles/

2、解题思路

这道题的意思是说给你一个二维数组M,这个二维数组表示两两之间有没有存在朋友关系,比如M[i][j] = 1 的话,就表示i和j是朋友关系,而且这种关系是可以传递的,比如i和j是朋友关系,j和k也是朋友关系,那么可以理解为i和k也是朋友关系;这是一道比较经典的并查集算法问题,并查集算法通常是为了解决 “动态连通性” 这一类问题;这道题我们可以用一个递归来实现,首先我们从第一个人A开始遍历,搜索他的朋友圈关系,如果他和某个人B有朋友关系,那么我们接着搜索B的朋友圈关系,如果到最后搜索到没有关系了就返回,那么问题来了,这样搜索的话我们可能会重复,因为如果在搜索B的朋友圈关系的时候,A已经是B的朋友了,且A已经被搜索过了,那么这样的话我们就需要一个标识位去记录是否搜索过某一个人,等到递归返回的时候就代表条完整的朋友链已经搜索完成,总的朋友圈数量+1即可。

3、代码

  • Java
public int findCircleNum(int[][] M) {
    if (null == M || M.length == 0) {
        return 0;
    }
    boolean[] connected = new boolean[M.length];  //记录是否查询过某一个朋友
    int friendCircleCount = 0;  //朋友圈总数
    for (int i = 0; i < M.length; i++) {
        if (connected[i]) {
            continue;
        }
        searchConnected(i, M, connected);
        friendCircleCount++;
    }
    return friendCircleCount;
}
public void searchConnected(int parent, int[][] M, boolean[] connected) {
    connected[parent] = true;
    for (int i = 0; i < M.length; i++) {
        //如果当前朋友没有被查询过,且与上一位查询的朋友存在关系,那么就搜索当前朋友的朋友圈关系
        if (!connected[i] && M[parent][i] == 1) {
            searchConnected(i, M, connected);
        }
    }
  • Python
由于太忙,后续补上
  • JavaScript
由于太忙,后续补上

4、提交结果

Viqzex.png

相关文章

网友评论

      本文标题:LeetCode547. Friend Circles

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