2923.找到冠军 I
【LetMeFly】2923.找到冠军 I:O(n^2)和O(n)的做法
力扣题目链接:https://leetcode.cn/problems/find-champion-i/
一场比赛中共有 n
支队伍,按从 0
到 n - 1
编号。
给你一个下标从 0 开始、大小为 n * n
的二维布尔矩阵 grid
。对于满足 0 <= i, j <= n - 1
且 i != j
的所有 i, j
:如果 grid[i][j] == 1
,那么 i
队比 j
队 强 ;否则,j
队比 i
队 强 。
在这场比赛中,如果不存在某支强于 a
队的队伍,则认为 a
队将会是 冠军 。
返回这场比赛中将会成为冠军的队伍。
示例 1:
输入:grid = [[0,1],[0,0]] 输出:0 解释:比赛中有两支队伍。 grid[0][1] == 1 表示 0 队比 1 队强。所以 0 队是冠军。
示例 2:
输入:grid = [[0,0,1],[1,0,1],[0,0,0]] 输出:1 解释:比赛中有三支队伍。 grid[1][0] == 1 表示 1 队比 0 队强。 grid[1][2] == 1 表示 1 队比 2 队强。 所以 1 队是冠军。
提示:
n == grid.length
n == grid[i].length
2 <= n <= 100
grid[i][j]
的值为0
或1
- 对于所有
i
,grid[i][i]
等于0.
- 对于满足
i != j
的所有i, j
,grid[i][j] != grid[j][i]
均成立 - 生成的输入满足:如果
a
队比b
队强,b
队比c
队强,那么a
队比c
队强
方法一:O(n^2)的做法
冠军队伍⇔
没有能胜过它的队伍。
因此我们只需要遍历每一列,如果哪一列全是$0$,那么这一对就是冠军。
- 时间复杂度$O(n^2)$
- 空间复杂度$O(1)$
AC代码
C++
1 |
|
Python
1 |
|
方法二:O(n)的做法
这题需要明白的是:所有队伍之间的能力值是“绝对的”,比的就是数值,不存在a克制b而b克制c而c克制a的情况。并且可以认为每个队伍的“能力值”各不相同。
这样,不妨假设冠军队伍是$ans=0$,接着我们只需要用变量$i$从$1$遍历到$n-1$,如果$i$剩余$ans$($grid[i][ans]=1$),则将$ans$替换为$i$。
这样,遍历结束后的$ans$即为唯一全胜的队伍,也就是冠军。
- 时间复杂度$O(n)$
- 空间复杂度$O(1)$
AC代码
C++
1 |
|
Python
1 |
|
同步发文于CSDN和我的个人博客,原创不易,转载经作者同意后请附上原文链接哦~
Tisfy:https://letmefly.blog.csdn.net/article/details/137678593
2923.找到冠军 I
https://blog.letmefly.xyz/2024/04/12/LeetCode 2923.找到冠军I/