原题链接在这里: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. 【转】由浅入深探究mysql索引结构原理、性能分析与优化

    摘要: 第一部分:基础知识 第二部分:MYISAM和INNODB索引结构 1.简单介绍B-tree B+ tree树 2.MyisAM索引结构 3.Annode索引结构 4.MyisAM索引与Inno ...

  2. [Vue]Scoped Css与Css Modules的区别

    均为解决CSS全局作用域问题(样式冲突(污染))的一个解决方案. 1.Scoped CSS 当 <style> 标签有 scoped 属性时,相当于在元素中添加了一个唯一属性用来区分. & ...

  3. tags

    运行tags在你的.vimrc 中加一个路径,set tags=/home/lh/1407k/arm/tags 注意此文件下的东西要注销必须用“执行一个ctags -R *;ctrl + ]过去,ct ...

  4. 常见ADB命令

    常见ADB命令 比如说知道了push和pull操作,就可以实现一个简单的手机助手. 如果有多台设备,操作的时候要指定设备.  -s加设备名称

  5. 2.SpringMVC源码分析:DispatcherServlet的初始化与请求转发

    一.DispatcherServlet的初始化 在我们第一次学Servlet编程,学java web的时候,还没有那么多框架.我们开发一个简单的功能要做的事情很简单,就是继承HttpServlet,根 ...

  6. main函数的参数:argc和argv

    程序一般是从main函数开始执行的,main函数标准格式: int main(int argc,char **argv) 其中argc是来自shell(或CMD)的参数的个数,argv是char型的二 ...

  7. Upgrade Bash on Ubuntu from 14.04 to 16.04

    过程 1 sudo -S apt-mark hold sudo sudo -S apt-mark hold procps sudo -S apt-mark hold strace 2 sudo do- ...

  8. HDU 5793 A Boring Question (找规律 : 快速幂+乘法逆元)

    A Boring Question Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others ...

  9. vux配置i18n

    根据使用文档,先引入i18n import VueI18n from 'vue-i18n'; Vue.use(VueI18n) const i18n = new VueI18n({ locale: ' ...

  10. L149

    Whenever I began to clean the house, my routine is to turn on my husband's PS3 and play my music fol ...