美文网首页
深度优先搜索系列二-leetcode 547 朋友圈

深度优先搜索系列二-leetcode 547 朋友圈

作者: 徐慵仙 | 来源:发表于2020-01-20 11:20 被阅读0次

题目

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

朋友圈.png

简析

矩阵遍历问题,循环判断所有小朋友,即从对角线点出发

  • 如果这个点是1,说明这个小朋友还没有属于任何一个朋友圈,朋友圈总数+1,从这个小朋友开始搜索,把他的朋友圈全都标记成2.
  • 如果这个点是2,则这个小朋友已经属于了某个朋友圈,不用再做任何操作

1) for循环范围

判断某个小朋友,自然要把这个小朋友的所有朋友找出来,行是传入的K,列是从第一列,到最后一列。

for(int j=0;j<M.size();j++)//1 确定for循环范围,扫描第k个人的朋友圈

2) 判断是否满足条件

  • 为1就可以,是朋友,继续搜
  • 为0就不是,什么都不用做
if(M[k][j]==1)

3)满足条件后如何

如此时是0行,0和1是朋友,则把(0,1),(1,1)这个两个点设为2,然后搜索1号小朋友。

  • 把找到的小朋友对应对角线元素设为2
  • 把这个点设为2,之后不再判断
  • 搜索找到的小朋友
if(M[k][j]==1){
           M[k][j]=2;
           M[j][j]=2;
           search(M,j);
}

4)主函数

主函数从第一个小朋友开始,遍历每一个小朋友,即对角线元素

  • 如果为1,朋友圈数+1,从它开始搜索
  • 不为1,说明已经属于某个朋友圈了并且已经搜索过了

完整代码

class Solution {
public:
    int findCircleNum(vector<vector<int>>& M) {
        int count=0;
        for(int i=0;i<M.size();i++){
                if(M[i][i]==1){
                    count++;
                    M[i][i]=2;
                    search(M,i);
                }
        }
        return count;
    }
    void search(vector<vector<int>>& M,int k){
        for(int j=0;j<M.size();j++)//1 确定for循环范围,扫描第k个人的朋友圈
        {
            if(M[k][j]==1){
                M[k][j]=2;
                M[j][j]=2;
                search(M,j);
            }
        }
    }
};

相关文章

网友评论

      本文标题:深度优先搜索系列二-leetcode 547 朋友圈

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