zoukankan      html  css  js  c++  java
  • LeetCode 547. Friend Circles 朋友圈(C++/Java)

    题目:

    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() == 0)
                return 0;
            m = M.size();
            int res = 0;
            for(int i = 0; i < m; ++i){
                if(M[i][i] == 1){
                    dfs(M, i);
                    res++;
                }
            }
            return res;
        }
    private:
        void dfs(vector<vector<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);
                }
            }
        }
        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;
    }
  • 相关阅读:
    Go基础篇【第2篇】: 内置库模块 fmt
    Go基础篇【第1篇】: 内置库模块 OS
    JavaScript学习基础篇【第1篇】: JavaScript 入门
    Python基础篇【第8篇】: Socket编程(二)SocketServer
    Python基础篇【第7篇】: 面向对象(1)
    APP爬虫之Appium使用
    python操作MongoDB
    MySQL性能调优
    ubuntu16.04中启动anaconda图形化界面
    linux 在命令行中通过conda使用anaconda
  • 原文地址:https://www.cnblogs.com/silentteller/p/12305239.html
Copyright © 2011-2022 走看看