Algorithm-week1

来源:互联网 发布:java相对路径怎么写 编辑:程序博客网 时间:2024/05/18 18:16

Week1

Problem--Medium

Problem Description:

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.

Sample Input:

Example 1:

Input: [[1,1,0], [1,1,0], [0,0,1]]Output: 2Explanation: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: 1Explanation: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.

题目理解:

首先,这个题目很容易看出是一个典型深度优先搜索的问题(广度优先也可以做),从一个人出发开始搜索,寻找与他直接有关系的朋友,找到一个后,再从这个朋友出发搜索,找与这个朋友有关系的朋友,如此递归下去,知道找到一个人没有除了上诉找过的人的其他朋友。在这个过程中,我们不但要进行深搜,还要记录哪些人已经被我们查找过了,避免重复查找,因此我用一个vector<bool> visited 来记录哪些人已经查找过了,后续查找中不再对他们进行搜索。只要在第一次调用DFS时的那个人是没有被查找过的,就认定有一个新的朋友圈产生。

代码:

class Solution {public:    int findCircleNum(vector<vector<int>>& M) {        int N = M.size();        int num = 0;        vector<bool> visited(N, false);        for (int i = 0; i < N; i++) {            if (DFS(i, visited, M)) {                num++;            }        }        return num;    }        bool DFS(int target, vector<bool> &visited, vector<vector<int>> &M) {        if (visited[target]) {            return false;        }        visited[target] = true;        for (int i = 0; i < visited.size(); i++) {            if (i != target && M[target][i]) {                DFS(i, visited, M);            }        }        return true;    }};





原创粉丝点击