原题链接在这里:https://leetcode.com/problems/friend-circles/description/

题目:

There are N students in a class. Some of them are friends, while some are not. Their friendship is transitive in nature. For example, if A is a direct friend of B, and B is a direct friend of C, then A is an indirect friend of C. And we defined a friend circle is a group of students who are direct or indirect friends.

Given a N*N matrix M representing the friend relationship between students in the class. If M[i][j] = 1, then the ith and jth students are direct friends with each other, otherwise not. And you have to output the total number of friend circles among all the students.

Example 1:

Input:
[[1,1,0],
[1,1,0],
[0,0,1]]
Output: 2
Explanation:The 0th and 1st students are direct friends, so they are in a friend circle.
The 2nd student himself is in a friend circle. So return 2.

Example 2:

Input:
[[1,1,0],
[1,1,1],
[0,1,1]]
Output: 1
Explanation:The 0th and 1st students are direct friends, the 1st and 2nd students are direct friends,
so the 0th and 2nd students are indirect friends. All of them are in the same friend circle, so return 1.

Note:

  1. N is in range [1,200].
  2. M[i][i] = 1 for all students.
  3. If M[i][j] = 1, then M[j][i] = 1.

题解:

与Number of Connected Components in an Undirected Graph类似. 可以采用DFS, BFS, Union Find三种方法.

当M[i][j] == 1. 就说明i 和 j是好友. DFS, BFS时标记走过的点即可.

Time Complexity: O(n^2). n = M.length. M上的点最多走两遍.

Space: O(n). 开了visited array标记. 最多用了n层stack.

AC Java:

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

BFS可以选择在出queue的时候更改标记.

Time Complexity: O(n^2). n = M.length.

Space: O(n).

AC Java:

 class Solution {
public int findCircleNum(int[][] M) {
if(M == null || M.length == 0 || M[0].length == 0){
return 0;
} int res = 0;
int len = M.length;
boolean [] visited = new boolean[len];
LinkedList<Integer> que = new LinkedList<Integer>();
for(int i = 0; i<len; i++){
if(!visited[i]){
res++;
que.add(i);
while(!que.isEmpty()){
int cur = que.poll();
visited[cur] = true;
for(int j = 0; j<len; j++){
if(!visited[j] && M[cur][j]==1){
que.add(j);
}
}
}
}
} return res;
}
}

Union Find Methos is to return the count of unions.

Time Complexity: O(n^2logn). find takes O(logn). With path compression and union by weight, amatorize O(1).

Space: O(n).

AC Java:

 class Solution {
public int findCircleNum(int[][] M) {
if(M == null || M.length == 0 || M[0].length == 0){
return 0;
} int n = M.length;
UnionFind uf = new UnionFind(n);
for(int i = 0; i<n; i++){
for(int j = 0; j<i; j++){
if(i!=j && M[i][j] == 1){
if(uf.find(i) != uf.find(j)){
uf.union(i, j);
}
}
}
} return uf.count;
}
} class UnionFind{
int [] parent;
int [] size;
int count; public UnionFind(int n){
this.parent = new int[n];
this.size = new int[n];
this.count = n; for(int i = 0; i<n; i++){
parent[i] = i;
size[i] = 1;
}
} public int find(int i){
while(i != parent[i]){
parent[i] = parent[parent[i]];
i = parent[i];
} return parent[i];
} public void union(int i, int j){
int x = find(i);
int y = find(j); if(size[x] > size[y]){
parent[y] = x;
size[x] += size[y];
}else{
parent[x] = y;
size[y] += size[x];
} this.count--;
}
}

类似The Earliest Moment When Everyone Become Friends.

LeetCode 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之深度优先搜索(DFS)专题-547. 朋友圈(Friend Circles)

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

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

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

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

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

  5. 【LeetCode】547. Friend Circles 解题报告(Python & Java & C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 日期 题目地址:https://leetcode.c ...

  6. 【LeetCode Weekly Contest 26 Q3】Friend Circles

    [题目链接]:https://leetcode.com/contest/leetcode-weekly-contest-26/problems/friend-circles/ [题意] 告诉你任意两个 ...

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

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

  8. [LeetCode] Number of Islands II 岛屿的数量之二

    A 2d grid map of m rows and n columns is initially filled with water. We may perform an addLand oper ...

  9. leetcode bugfree note

    463. Island Perimeterhttps://leetcode.com/problems/island-perimeter/就是逐一遍历所有的cell,用分离的cell总的的边数减去重叠的 ...

随机推荐

  1. JavaScript权威指南--语句

    知识要点 在javascript中,表达式是短语,那么语句(statement)就是整句或命令.表达式计算出一个值,但语句用来执行以使某件事发生. 1.表达式语句 具有副作用的表达式是JavaScri ...

  2. Java 基于javaMail的邮件发送(支持附件)

    基于JavaMail的Java邮件发送Author xiuhong.chen@hand-china.com Desc 简单邮件发送 Date 2017/12/8 项目中需要根据物料资质的状况实时给用户 ...

  3. 项目使用文档管理:MediaWiki安装及使用入门

    MediaWiki是著名的开源wiki引擎,全球最大的wiki项目维基百科(百科词条协作系统)是使用MediaWiki的成功范例,MediaWiki的最大作用在于对知识的归档,可用于构建企业/个人知识 ...

  4. Spring的引用内部Bean属性和给级联属性

    第一个是内部Bean的配置:               首先是要理解其中的原理,再去操作就很简单了,下面老表就给大家说一下自己的观点(有点简单,但是老表我第一次学习的时候看着视频上的代码确实有点懵逼 ...

  5. brew || yarn 软件包管理工具

    1.brew || yarn 软件包管理工具

  6. day35 爬虫简述

    爬虫概要 - pip3 install requests - pip3 install beautifulsoup4 基本爬虫: - Python实现浏览器行为,requests - beautifu ...

  7. Ansible 小手册系列 三(命令介绍)

    仅仅只是介绍,可以选择跳过 ansible ansible是指令核心部分,其主要用于执行ad-hoc命令,即单条命令.默认后面需要跟主机和选项部分,默认不指定模块时,使用的是command模块. Us ...

  8. 使用Python自带的库和正则表达式爬取熊猫直播主播观看人气

    主要是体现代码的规范性 from urllib import request import re class Spider(): url = 'https://www.panda.tv/cate/lo ...

  9. Accesshelper.cs

    using System; using System.Data; using System.Data.OleDb; using System.Collections; using System.IO; ...

  10. 初次使用Bootstrap

    一.概述也好,过程也好,反正就是这样 知道这个还是从群里听到的,一个人的视野是有限,必须借助他人来扩展.好奇使我去搜索了解了一下.原来是一个网页前端框架,可以适合不同大小屏幕,自动适应正常显示.这就是 ...