美文网首页
LeetCode547 Friend Circles

LeetCode547 Friend Circles

作者: phantom34 | 来源:发表于2019-05-23 11:48 被阅读0次

题目

547. 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.
Note:
N is in range [1,200].
M[i][i] = 1 for all students.
If M[i][j] = 1, then M[j][i] = 1.

题解

简单并查集题目 而且N范围在[1,200] 直接dfs也可以(dfs代码行数少的贼舒服)

代码

1.并查集


fun findCircleNum1(M: Array<IntArray>): Int {
    var parent: IntArray = IntArray(M[0].size)
    var count = 0
    init(parent)
    for (i in M.indices) {
        for (j in M[i].indices) {
            if (j == i)
                continue
            if (M[i][j] == 1)
                merge(i, j, parent)
        }
    }
    for (i in parent.indices)
        if (i == parent[i])
            count++
    return count
}

fun init(parent: IntArray) {
    for (i in parent.indices)
        parent[i] = i
}

fun find(x: Int, parent: IntArray): Int {
    var k: Int
    var j: Int
    var r = 0
    r = x
    while (r != parent[r])
        r = parent[r]
    k = x
    while (k != r) {
        j = parent[k]
        parent[k] = r
        k = j
    }
    return r
}

fun merge(x: Int, y: Int, parent: IntArray) {
    var x1 = find(x, parent)
    var y1 = find(y, parent)
    if (x1 == y1)
        return
    if (x1 < y1) {
        parent[y1] = x1
    } else {
        parent[x1] = y1
    }

}

2.dfs


lateinit var vist: IntArray
lateinit var map: Array<IntArray>

fun findCircleNum(M: Array<IntArray>): Int {
    var count = 0
    vist = IntArray(M.size)
    map = M

    for (i in M.indices) {
        if (vist[i] == 0) {
            dfs(i)
            count++
        }
    }
    return count
}

fun dfs(x: Int) {
    vist[x] = 1
    for (i in map.indices)
        if (vist[i] == 0 && map[x][i] == 1)
            dfs(i)
}

提交结果

image.png

相关文章

网友评论

      本文标题:LeetCode547 Friend Circles

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