LC每日一题|20240413 - 2924. 找到冠军 I I

78 阅读2分钟

LC每日一题|20240413 - 2924. 找到冠军 II

一场比赛中共有 n 支队伍,按从 0 到  n - 1 编号。每支队伍也是 有向无环图(DAG) 上的一个节点。

给你一个整数 n 和一个下标从 0 开始、长度为 m 的二维整数数组 edges 表示这个有向无环图,其中 edges[i] = [ui, vi] 表示图中存在一条从 ui 队到 vi 队的有向边。

a 队到 b 队的有向边意味着 a 队比 b ,也就是 b 队比 a

在这场比赛中,如果不存在某支强于 a 队的队伍,则认为 a 队将会是 冠军

如果这场比赛存在 唯一 一个冠军,则返回将会成为冠军的队伍。否则,返回 -1

注意

  • 是形如 a1, a2, ..., an, an+1 的一个序列,且满足:节点 a1 与节点 an+1 是同一个节点;节点 a1, a2, ..., an 互不相同;对于范围 [1, n] 中的每个 i ,均存在一条从节点 ai 到节点 ai+1 的有向边。
  • 有向无环图 是不存在任何环的有向图。

提示:

  • 1 <= n <= 100
  • m == edges.length
  • 0 <= m <= n * (n - 1) / 2
  • edges[i].length == 2
  • 0 <= edge[i][j] <= n - 1
  • edges[i][0] != edges[i][1]
  • 生成的输入满足:如果 a 队比 b 队强,就不存在 b 队比 a 队强
  • 生成的输入满足:如果 a 队比 b 队强,b 队比 c 队强,那么 a 队比 c 队强

题目级别:Medium

解题思路

我们只需要统计所有节点的 入度 ,获取入度为 0 的节点即可。根据题意,如果有超过 1 个节点的入度为 0 ,则返回 -1

AC代码

class Solution {
    fun findChampion(n: Int, edges: Array<IntArray>): Int {
        val map = IntArray(n) 
        edges.forEach { map[it[1]]++ }
        val first = map.indexOf(0)
        val last = map.lastIndexOf(0)
        return if (first == last) first else -1
    }
}

时间复杂度:O(n^2),需要遍历整个edges数组

空间复杂度:O(n),需要定义一个长度为n的数组存储入度

碎碎念

没想到昨天竟然压中题了...