问题描述

在一个班级里有N个同学, 有些同学是朋友,有些不是。他们之间的友谊是可以传递的比如A和B是朋友,B和C是朋友,那么A和C也是朋友。我们定义 friend circle为由直接或者间接都是朋友组成的group.

给定N*N 数组 M 代表同学之间的关系. 如果M[i][j] = 1, 那么i 和 j 同学是朋友,现在我们需要输出friend circles 的数量

Example 1:

Input:

[[1,1,0],

[1,1,0],

[0,0,1]]

Output: 2

解释: 0和1号同学是朋友,所以他们是一个friend cricle,2号同学自己是个friend circle,所有返回2。

Example 2:

Input:

[[1,1,0],

[1,1,1],

[0,1,1]]

Output: 1

解释: 0号同学和1号同学是朋友,1号和2号同学是朋友,那么0,1,2都是朋友,他们组成一个friend circle,所以结果返回1

Note

N is in range [1,200].

M[i][i] = 1 for all students.

If M[i][j] = 1, then M[j][i] = 1.

分析

我们可以将给定的M数组看做是一个graph, M[i][j] = 1 表示节点i 和 j 相连,那么寻找fridend circle的问题,转化为图遍历的问题,求fiend circle的个数实则为求连通图的个数。解决这类问题通常使用DFS或者BFS去更新一个状态数组visited(保存节点是否被访问),对每个未访问的节点调用图形遍历算法,每次调用所有相连节点的状态都会被更新为已访问,那么friend cicle的数量则为调用遍历的次数。

DFS实现

public int findCircleNum(int[][] M) {
int N = M.length;
boolean[] visited = new boolean[N];
int cnt = 0;
for(int i = 0; i < N; i++){
if(!visited[i]){
dfs(M, visited, i);
cnt++;
}
}
return cnt;
} private void dfs(int[][] M, boolean[] visited, int i){
visited[i] = true;
for(int j = 0; j < M.length; j++){
if(M[i][j] == 1 && !visited[j]){
dfs(M, visited, j);
}
}
}

时间复杂度:O(n^2),总体上要遍历M数组的所有位置

空间复杂度:O(n)

BFS实现

   public int findCircleNum(int[][] M) {
boolean[] visited = new boolean[M.length];
int count = 0;
Queue < Integer > queue = new LinkedList < > ();
for (int i = 0; i < M.length; i++) {
if (!visited[i]) {
queue.add(i);
while (!queue.isEmpty()) {
int s = queue.remove();
visited[s] = true;
for (int j = 0; j < M.length; j++) {
if (M[s][j] == 1 && !visited[j]])
queue.add(j);
}
}
count++;
}
}
return count;
}

时间复杂度:O(n^2),总体上要遍历M数组的所有位置

空间复杂度:O(n)

Leetcode547: Friend Circles 朋友圈问题的更多相关文章

  1. [LeetCode] Friend Circles 朋友圈

    There are N students in a class. Some of them are friends, while some are not. Their friendship is t ...

  2. [LeetCode] 547. Friend Circles 朋友圈

    There are N students in a class. Some of them are friends, while some are not. Their friendship is t ...

  3. LeetCode 547. Friend Circles 朋友圈(C++/Java)

    题目: https://leetcode.com/problems/friend-circles/ There are N students in a class. Some of them are ...

  4. 547 Friend Circles 朋友圈

    班上有 N 名学生.其中有些人是朋友,有些则不是.他们的友谊具有是传递性.如果已知 A 是 B 的朋友,B 是 C 的朋友,那么我们可以认为 A 也是 C 的朋友.所谓的朋友圈,是指所有朋友的集合.给 ...

  5. [LeetCode]547. Friend Circles朋友圈数量--不相邻子图问题

    /* 思路就是遍历所有人,对于每一个人,寻找他的好友,找到好友后再找这个好友的好友 ,这样深度优先遍历下去,设置一个flag记录是否已经遍历了这个人. 其实dfs真正有用的是flag这个变量,因为如果 ...

  6. [Swift]LeetCode547. 朋友圈 | Friend Circles

    There are N students in a class. Some of them are friends, while some are not. Their friendship is t ...

  7. Leetcode之深度优先搜索(DFS)专题-547. 朋友圈(Friend Circles)

    Leetcode之深度优先搜索(DFS)专题-547. 朋友圈(Friend Circles) 深度优先搜索的解题详细介绍,点击 班上有 N 名学生.其中有些人是朋友,有些则不是.他们的友谊具有是传递 ...

  8. Leetcode547 朋友圈解题报告 (DFS

    题目描述: 班上有 N 名学生.其中有些人是朋友,有些则不是.他们的友谊具有是传递性.如果已知 A 是 B 的朋友,B 是 C 的朋友,那么我们可以认为 A 也是 C 的朋友.所谓的朋友圈,是指所有朋 ...

  9. QQ空间/朋友圈类界面的搭建

    类似于QQ空间的布局主要是在说说信息.点赞.回复三大部分的自适应布局上. 当我们需要搭建类似QQ空间.微信朋友圈的界面的时候,可做如下操作: 创建一个对应的model类: 创建一个对应model类的f ...

随机推荐

  1. RubyGem 下载时连接失败的解决方法

    RubyGem 下载 gem 包失败,有一定原因是 https 导致的. 搜索了很久,找到一个解决的方法. 1.下载 cacert.pem,也就是 curl 的证书. http://curl.haxx ...

  2. error Couldn't find a package.json file in

    error Couldn't find a package.json file in解决方法:首先初始化,再安装相应的文件 (1). npm init -f //强迫初始化文件 (2). npm in ...

  3. apache thrift 和 apache jersey 记录

    几篇好的入门文档链接: 1. Hello World by Thrift Using Java 2. Thrift 实例 Helloworld 3. Thrift版的Hello World 4. Th ...

  4. GRPC的metadata使用

    文章目录 一.简析 1.创建metadata 2.发送metadata 3.接收metadata 二.代码举例 1.proto文件编写 2.server端编写 3.client端编写 三.实际使用举例 ...

  5. 数据库Oracle的含义

    数据库的含义: 所谓的数据库其实就是数据的集合.用户可以对集合中的数据进行新增.查询.更新. 删除等操作.数据库是以一定方式储存在一起.能与多个用户共享.具有尽可能小的冗余度. 与应用程序彼此独立的数 ...

  6. Asp.net MVC + AngularJS 统一权限管理系统(一)

    背景: 之前公司内部做了不少系统,但是权限管理都是分开的:一直都想能够有一套统一管理的权限管理系统:有的时间都是一直在计划,随着时间的流逝,计划始终没有实现,也随着项目的增多而这权限管理也变得版本多样 ...

  7. [TimLinux] Python 函数(2)

    1. 作用 最大化的代码重用:建设复制.粘贴 最小化的代码冗余:减少重复代码 流程分解:将做一件事情分解为相应的步骤,不同步骤封装在不同的函数中. 2. 定义 def 函数名(可选的参数列表): 函数 ...

  8. AtCoder-3920

    We have a 3×3 grid. A number ci,j is written in the square (i,j), where (i,j) denotes the square at ...

  9. 支付宝支付功能(使用支付宝sdk)

    1.准备参数        新建一个公共参数配置类NewAlipayconfig (可将参数存放到config配置文件中读取)          public class NewAlipayconfi ...

  10. 当用python读取几十万行文本时,会出现什么状况?

      前言本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理.作者:accumulate_zhang    我在使用python读取几十 ...