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 - 1i != 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] 的值为 01
  • 对于所有 i grid[i][i] 等于 0.
  • 对于满足 i != j 的所有 i, jgrid[i][j] != grid[j][i] 均成立
  • 生成的输入满足:如果 a 队比 b 队强,b 队比 c 队强,那么 a 队比 c 队强

方法一:O(n^2)的做法

冠军队伍没有能胜过它的队伍。

因此我们只需要遍历每一列,如果哪一列全是$0$,那么这一对就是冠军。

  • 时间复杂度$O(n^2)$
  • 空间复杂度$O(1)$

AC代码

C++

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class Solution {
public:
int findChampion(vector<vector<int>>& grid) {
int n = grid.size();
for (int j = 0; j < n; j++) {
bool ok = true;
for (int i = 0; i < n; i++) {
if (grid[i][j]) {
ok = false;
break;
}
}
if (ok) {
return j;
}
}
return -1; // Fake Return
}
};

Python

1
2
3
4
5
6
7
8
9
10
11
12
13
14
from typing import List

class Solution:
def findChampion(self, grid: List[List[int]]) -> int:
n = len(grid)
for j in range(n):
ok = True
for i in range(n):
if grid[i][j]:
ok = False
break
if ok:
return j
return -1 # Fake Return

方法二: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
2
3
4
5
6
7
8
9
10
11
12
class Solution {
public:
int findChampion(vector<vector<int>>& grid) {
int ans = 0;
for (int i = 1; i < grid.size(); i++) {
if (grid[i][ans]) {
ans = i;
}
}
return ans;
}
};

Python

1
2
3
4
5
6
7
8
9
# from typing import List

class Solution:
def findChampion(self, grid: List[List[int]]) -> int:
ans = 0
for i in range(len(grid)):
if grid[i][ans]:
ans = i
return ans

同步发文于CSDN和我的个人博客,原创不易,转载经作者同意后请附上原文链接哦~
Tisfy:https://letmefly.blog.csdn.net/article/details/137678593


2923.找到冠军 I
https://blog.letmefly.xyz/2024/04/12/LeetCode 2923.找到冠军I/
作者
Tisfy
发布于
2024年4月12日
许可协议