题目描述
一场比赛中共有 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
队强
1. 思路
矩阵每一行 grid[i] 表示队伍 i 与其他队伍的强弱情况。如果队伍 i 是冠军,那么对于所有 j!=i,均有 grid[i][j]=1,而 grid[i][i]=0。因此如果队伍 i 是冠军,则有 sum(grid[i])=n−1。队伍的强弱关系具有传递性,不能成环,所以一定存在冠军。又因为任何两个队伍,存在强弱关系。基于以上两点,有且只有一个冠军。只要遍历 i,找到第一个满足 sum(grid[i])=n−1 的 i 即可。
2. 代码
public int findChampion(int[][] grid) {
int length=grid.length;
for(int i=0;i<length;i++){
int cnt=0;
for(int j=0;j<length;j++){
cnt+= grid[i][j];
}
if(cnt==length-1)return i;
}
return -1;
}