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.lengthn == grid[i].length2 <= n <= 100grid[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/