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;
    }
  • 相关阅读:
    【转载】著名黑客雷蒙评价几种编程语言
    【GUI开发】Swing的一本极好的入门教材
    【数据结构】数组操作(HighArrayApp.java)
    数据另存为CSV档案(也是一种excel档案)【2】------自主选择路径
    TIniFile实现打开窗体后还原用户之前的配置的功能
    sql server内连接(inner join)、外连接(left outer join、right outer join、full outer join)、记录合并(union、union all)
    @指针、Cardinal()、Integer()、指针取值解析
    关于php编程的一些小技巧
    数据库操作,同时更新多条数据
    省份,城市,地区------三级联动菜单//要加注释
  • 原文地址:https://www.cnblogs.com/silentteller/p/12305239.html
Copyright © 2011-2022 走看看