LeetCode Friend Circles
原题链接在这里: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:
- N is in range [1,200].
- M[i][i] = 1 for all students.
- 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的更多相关文章
- [LeetCode] Friend Circles 朋友圈
There are N students in a class. Some of them are friends, while some are not. Their friendship is t ...
- Leetcode之深度优先搜索(DFS)专题-547. 朋友圈(Friend Circles)
Leetcode之深度优先搜索(DFS)专题-547. 朋友圈(Friend Circles) 深度优先搜索的解题详细介绍,点击 班上有 N 名学生.其中有些人是朋友,有些则不是.他们的友谊具有是传递 ...
- [LeetCode] 547. Friend Circles 朋友圈
There are N students in a class. Some of them are friends, while some are not. Their friendship is t ...
- LeetCode 547. Friend Circles 朋友圈(C++/Java)
题目: https://leetcode.com/problems/friend-circles/ There are N students in a class. Some of them are ...
- 【LeetCode】547. Friend Circles 解题报告(Python & Java & C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 日期 题目地址:https://leetcode.c ...
- 【LeetCode Weekly Contest 26 Q3】Friend Circles
[题目链接]:https://leetcode.com/contest/leetcode-weekly-contest-26/problems/friend-circles/ [题意] 告诉你任意两个 ...
- [LeetCode]547. Friend Circles朋友圈数量--不相邻子图问题
/* 思路就是遍历所有人,对于每一个人,寻找他的好友,找到好友后再找这个好友的好友 ,这样深度优先遍历下去,设置一个flag记录是否已经遍历了这个人. 其实dfs真正有用的是flag这个变量,因为如果 ...
- [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 ...
- leetcode bugfree note
463. Island Perimeterhttps://leetcode.com/problems/island-perimeter/就是逐一遍历所有的cell,用分离的cell总的的边数减去重叠的 ...
随机推荐
- [sping]xml配置文件中factory-bean与factory-method(spring使用工厂方法注入bean)
public class CarFactory { //非静态方法 public Car createCar(){ Car car = new Car(); car.setBrand("BM ...
- git代码版本回退
git log 用于查看我们修改提交的快照记录(commit记录),然后会有个commit修改记录的id编号,该命令显示从最近到最远的提交日志,我们可以看到3次提交记录,如下: git checkou ...
- shell数组中“和@的妙用
#!/bin/bashlist=(4k"8k a bit""16k abc""32k gold"64k)for i in "${l ...
- List和数组的相互转化
一.数组转化为list:Arrays.aslist(arr); public static void main(String[] args) { String[] arr={"apple&q ...
- Java subList的使用
1. 在看<阿里巴巴java编程手册的时候>有如下强制约束 顺便学了一下subList. java.util.List中有一个subList方法,用来返回一个list的一部分的视图. Li ...
- 同步锁Lock
用于解决多线程安全问题有三种方式: 同步代码块(隐式锁,基于JVM) 同步方法(隐式锁,基于JVM) 同步锁(显式锁,jdk1.5后出现,相对于前两种方式,更加灵活) 下面通过一段程序来说明一下同步锁 ...
- ADO.NET简介
一.ADO.NET ADO.NET源起ADO(ActiveX Data Objects),是一个COM组件库,在NET编程环境中优先使用的数据访问接口, 提供对诸如 SQL Server 和 XML ...
- js面向对象之:创建对象
最近在学习<js高级程序设计>,之前所接触的很多的js类库和jQuery插件都会用面向对象的方式来设计,而自己却还是停留在面向方法的阶段,所以今天好好记录一下学习的js创建对象. 第一种方 ...
- MayBatis与Spring的整合
1. 步骤 第一步:导入相关的jar包(spring和mybatis) mybatis-spring-*.jar spring-jdbc-*.jar spring-tx-*.jar 第二步:sprin ...
- 添加operations模块
添加operations模块,models内容为: from django.db import models from datetime import datetime from users.mode ...