2923. 找到冠军 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队强
解法
方法一:枚举
我们可以枚举每一支队伍 $i$,如果 $i$ 队的每一场比赛都赢了,那么 $i$ 队就是冠军,直接返回 $i$ 即可。
时间复杂度 $O(n^2)$,其中 $n$ 是队伍数量。空间复杂度 $O(1)$。
Python3
class Solution:
def findChampion(self, grid: List[List[int]]) -> int:
for i, row in enumerate(grid):
if all(x == 1 for j, x in enumerate(row) if i != j):
return i
Java
class Solution {
public int findChampion(int[][] grid) {
int n = grid.length;
for (int i = 0;; ++i) {
int cnt = 0;
for (int j = 0; j < n; ++j) {
if (i != j && grid[i][j] == 1) {
++cnt;
}
}
if (cnt == n - 1) {
return i;
}
}
}
}
C++
class Solution {
public:
int findChampion(vector<vector<int>>& grid) {
int n = grid.size();
for (int i = 0;; ++i) {
int cnt = 0;
for (int j = 0; j < n; ++j) {
if (i != j && grid[i][j] == 1) {
++cnt;
}
}
if (cnt == n - 1) {
return i;
}
}
}
};
Go
func findChampion(grid [][]int) int {
n := len(grid)
for i := 0; ; i++ {
cnt := 0
for j, x := range grid[i] {
if i != j && x == 1 {
cnt++
}
}
if cnt == n-1 {
return i
}
}
}
TypeScript
function findChampion(grid: number[][]): number {
for (let i = 0, n = grid.length; ; ++i) {
let cnt = 0;
for (let j = 0; j < n; ++j) {
if (i !== j && grid[i][j] === 1) {
++cnt;
}
}
if (cnt === n - 1) {
return i;
}
}
}