zoukankan      html  css  js  c++  java
  • LeetCode 547 朋友圈

    题目:

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

    给定一个 N * N 的矩阵 M,表示班级中学生之间的朋友关系。如果M[i][j] = 1,表示已知第 i 个和 j 个学生互为朋友关系,否则为不知道。你必须输出所有学生中的已知的朋友圈总数。

    示例 1:

    输入: 
    [[1,1,0],
     [1,1,0],
     [0,0,1]]
    输出: 2 
    说明:已知学生0和学生1互为朋友,他们在一个朋友圈。
    第2个学生自己在一个朋友圈。所以返回2。
    

    示例 2:

    输入: 
    [[1,1,0],
     [1,1,1],
     [0,1,1]]
    输出: 1
    说明:已知学生0和学生1互为朋友,学生1和学生2互为朋友,所以学生0和学生2也是朋友,所以他们三个在一个朋友圈,返回1。
    

    注意:

    1. N 在[1,200]的范围内。
    2. 对于所有学生,有M[i][i] = 1。
    3. 如果有M[i][j] = 1,则有M[j][i] = 1。

    解题思路:

    遍历所有的好友,因为这里输出的是朋友圈的个数,所以我们只统计“遍历了几次”就可以了。也就是说每一次遍历结束,就能统计出一个朋友圈。

    代码:

    DFS遍历:

     1 class Solution {
     2 public:
     3     int findCircleNum(vector<vector<int>>& M) {
     4         int ans = 0;
     5         int n = M.size();
     6         vector<bool> visited(n, false);
     7         for(int i = 0; i < n; ++i) {
     8             if(!visited[i]) {
     9                 DFS(M, i, visited);
    10                 ++ans;
    11             }
    12         }
    13         return ans;
    14     }
    15     void DFS(vector<vector<int>> M, int i, vector<bool> &visited) {
    16         visited[i] = true;
    17         for(int j = 0; j < M.size(); ++j) {
    18             if(M[i][j] && !visited[j])
    19                 DFS(M, j, visited);
    20         }
    21     }
    22     
    23 };

    BFS遍历:

     1 class Solution {
     2 public:
     3     int findCircleNum(vector<vector<int>>& M) {
     4         int ans = 0;
     5         int n = M.size();
     6         queue<int> q;
     7         vector<bool> visited(n, false);
     8         for(int i = 0; i < n; ++i) {
     9             if(visited[i])
    10                 continue;
    11             ++ans;
    12             q.push(i);
    13             visited[i] = true;
    14             while(!q.empty()) {
    15                 int k = q.front();
    16                 q.pop();
    17                 for(int j = 0; j < n; ++j) {
    18                     if(!visited[j] && M[k][j] ) {
    19                         q.push(j);
    20                         visited[j] = true;
    21                     }
    22                 }
    23             }
    24         }
    25         return ans;
    26     }
    27 };
  • 相关阅读:
    windows平台部署.netcore和vue项目
    .netcore系统权限认证
    全文检索 识别pdf 图片OCR识别
    搜索引擎solr的安装与配置
    SQLSugar动态拼接Lambda表达式(顺便提一个sqlsugar框架的bug)
    .netcore项目部署linux
    vue+element 部署linux服务器
    使用七牛云存储上传文件学习案例
    MSSQL 全库搜索 指定字符串
    系统右键自定义功能-右键备份【C#】
  • 原文地址:https://www.cnblogs.com/moxiangfeng/p/10700566.html
Copyright © 2011-2022 走看看