题目:

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

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.

分析:

有n个学生,如果a和b是朋友,b和c是朋友,那么a和c也是朋友,求出学生中的朋友圈个数(a,b,c同属一个朋友圈)

朋友之间的关系由矩阵表示,1表示是朋友关系,同时自己和自己也是朋友关系。

首先我们从第一个学生开始遍历,利用M[i][i]是否等于1来判断是否访问过这个学生,然后从这个学生开始去扫描其他的学生是否和这个学生是朋友关系,如果是的话,将他们的关系修改为非朋友,同时继续搜索下去,直到这个圈子不再有新的学生了,同时结果加1,因为这个朋友圈所有的人我们都遍历过了,然后再继续访问后面的学生,如果有M[i][i]等于1的话,意味着有新的圈子出现,继续搜索即可,处理完一个朋友圈结果记得加一。

程序:

C++

class Solution {
public:
int findCircleNum(vector<vector<int>>& M) {
if(M.size() == )
return ;
m = M.size();
int res = ;
for(int i = ; i < m; ++i){
if(M[i][i] == ){
dfs(M, i);
res++;
}
}
return res;
}
private:
void dfs(vector<vector<int>>& M, int i){
if(M[i][i] == )
return;
M[i][i] = ;
for(int k = ; k < m; ++k){
if(M[k][i] == ){
M[k][i] = M[i][k] = ;
dfs(M, k);
}
}
}
int m;
};

Java

class Solution {
public int findCircleNum(int[][] M) {
if(M.length == 0)
return 0;
m = M.length;
int res = 0;
for(int i = 0; i < m; ++i){
if(M[i][i] == 1){
dfs(M, i);
res++;
}
}
return res;
}
private void dfs(int[][] M, int i){
if(M[i][i] == 0)
return;
M[i][i] = 0;
for(int k = 0; k < m; ++k){
if(M[k][i] == 1){
M[k][i] = M[i][k] = 0;
dfs(M, k);
}
}
}
private int m;
}

最新文章

  1. 在Activity之间传递参数(一)
  2. js 方法封装实例
  3. 【FTP】C# System.Net.FtpClient库连接ftp服务器(上传文件)
  4. 关于json的知识整理
  5. Android Apps开发环境搭建
  6. light oj 1116 - Ekka Dokka
  7. sqlserver 批量修改表前缀
  8. Dubbo java.io.IOException: Can not lock the registry cache file
  9. NancyFX 第九章 Responses(响应对象)
  10. java的泛型
  11. Python Basic 01.Basic
  12. JS变量的提升详解
  13. Linux网络设备驱动的实现
  14. Docker Swarm volume 数据持久化
  15. Python学习笔记10--unittest参数化
  16. eclipse preference plugin development store and get
  17. asp.net网站服务器搭建之从零开始
  18. UE4新手编程之创建空白关卡和添加碰撞体
  19. 20165310 java_blog_week2
  20. BEA-141150 - An error occurred while preparing application component uri of application application with HTTP response responseCode: message

热门文章

  1. 【Spring Cloud 源码解读】之 【如何配置好OpenFeign的各种超时时间!】
  2. 洛谷P1720 月落乌啼算钱 题解 斐波那契数列/特征方程求解
  3. Inception V1、V2、V3和V4
  4. 世界上最流行的版本控制系统——Git
  5. redis 注意事项
  6. ajxa的TypeError: $.ajax is not a function的冲突问题
  7. [bzoj2120] [洛谷P1903] 数颜色
  8. python 获取一个网页里的a 标签
  9. 从maven安装配置到idea成功创建maven项目
  10. 【Java并发基础】局部变量是线程安全的