美文网首页
leetcode-朋友圈

leetcode-朋友圈

作者: 嘎嘣脆哦哦 | 来源:发表于2019-02-27 14:17 被阅读0次

解析

方法一:DFS

遍历所有人,对于每一个人,寻找他的好友,找到好友后再找这个好友的好友,这样深度优先遍历下去,设置一个visited记录是否已经遍历了这个人。 因为如果m个人最多m个朋友圈,设置后visited后,相同的朋友圈会检测到visited[i]!=0就会不算数

class Solution {
  public int findCircleNum(int[][] M) {
        int res = 0;
        int[] visited = new int[M.length];
        for (int i = 0; i < M.length; i++) {
            if (visited[i] == 0) {
               //没有访问到,就把当前的组+1,并把可以包含在朋友圈的所有的有关系的好友标记出来
                res++;
                dfs(M, visited, i);
            }
        }
        return res;
    }
     
    private void dfs(int[][] M, int[] visited, int i) {
        visited[i] = 1;
        for (int j = 0; j < M.length; j++) {
            if (M[i][j] == 1 && visited[j] == 0) {
                dfs(M, visited, j);//在去找这个好友的好友
            }
             
        }
    }
}

方法二:BFS

import java.util.LinkedList;
import java.util.Queue;
class Solution {
    Queue<Integer> q = new LinkedList<>();
    public void bfs(int[][] M, int[] visited, int i) {
        q.offer(i);
        visited[i] = 1;
        while (!q.isEmpty()) {
            int node = q.poll();
            for (int j = 0; j < M.length; j++) {
                // 未被访问过且是邻接点,注意是node的邻接点
                if (visited[j] == 0 && M[node][j] == 1) {
                    // visit[j];
                    q.offer(j);
                    visited[j] = 1;
                }
            }
        }
    }
    public int findCircleNum(int[][] M) {
        int[] visited = new int[M.length];
        int count = 0;
        for (int i = 0; i < M.length; i++) {
            if (visited[i] == 0) {
                bfs(M, visited, i);
                count++;
            }
        }
        return count;
    }
}

方法三:并查集

class Solution {
    private int find(int x, int [] pre){////找到x属于哪一个组,如果不是自成一组,在往下找pre[x]属于哪个组
        return pre[x]==x ? x :  find(pre[x], pre);
    }
    public int findCircleNum(int[][] M) {
        if (M.length==0)return 0;
        int pre[]=new int[M.length];
        for(int i=0; i<M.length; i++)
            pre[i] = i;//先各自为组,组名也为自己的序号
        int group = M.length;//一开始有多少人就有多少个朋友圈,当每出现一对朋友时就减1,最后就是总的朋友圈数量了。
        for(int i=0; i<M.length; i++){
            for(int j=0; j<M.length; j++){
                if (i != j && M[i][j] == 1){
                    int x1 = find(i, pre);//x1为i所属的组
                    int x2 = find(j, pre);//x2为j所属的组
                    if (x1 != x2){
                        //如果不属于同个朋友圈的话就把i归为j的组
                        pre[x1] = x2;
                        group--;
                    }
                }
            }
        }
        return group;
    }
}

相关文章

  • leetcode-朋友圈

    解析 方法一:DFS 遍历所有人,对于每一个人,寻找他的好友,找到好友后再找这个好友的好友,这样深度优先遍历下去,...

  • 【leetcode-动态规划】Longest Increasin

    【leetcode-动态规划】Longest Increasing Subsequence 给定一个无序的整数数组...

  • LeetCode-股票问题

    LeetCode-股票问题 121. 买卖股票的最佳时机[https://leetcode-cn.com/prob...

  • 算法—字符串编码

    题目: 字符串编码(LeetCode-中等) 编码规则为: k[encoded_string],表示其中方括号内部...

  • 一起学算法-69. x 的平方根

    一、题目 LeetCode-算法入门-69. x 的平方根地址:https://leetcode-cn.com/p...

  • Leetcode-报数

    0.题目 报数序列是一个整数序列,按照其中的整数的顺序进行报数,得到下一个数。 输入输出报数写作11一个一1121...

  • LeetCode-链表

    LeetCode-链表 链表(Linked List)是一种常见的基础数据结构,是一种线性表,但是并不会按线性的顺...

  • leetcode-报数

    报数序列是一个整数序列,按照其中的整数的顺序进行报数,得到下一个数。其前五项如下: 1 被读作 "one 1" ...

  • 【leetcode-动态规划】零钱兑换

    【leetcode-动态规划】零钱兑换 给定不同面额的硬币 coins 和一个总金额 amount。编写一个函数来...

  • 【leetcode-数组】三数之和

    【leetcode-数组】三数之和 给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 ...

网友评论

      本文标题:leetcode-朋友圈

      本文链接:https://www.haomeiwen.com/subject/eyffuqtx.html