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.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 队强
思路一:
根据题意查找冠军队伍,对于本题就是查找二维数组grid[i][j]符合条件的i或者j,如果按照行去判断设计的状态比按照列复杂,此处使用列做枚举判断,出现 i != j 并且grid[i][j] != 1 时就找到了冠军j。
思路二:
当然还可以另一种思路 a 队比 b 队强,b 队比 c 队强,那么 a 队比 c 队强,grid[i][j]代表这i与j哪个队强,那么在n个队伍中我们就按个遍历这些队伍即可。
代码如下:
使用列做枚举判断
public int findChampion(int[][] grid) {
// 判断列中是否有1 有就说明i强于j
int length = grid.length;
for (int j = 0; j < length; j++) {
//设置冠军标识
boolean isChampion = true;
for (int i = 0; i < length; i++) {
if (i != j && grid[i][j] == 1) {
// 出现二维数组值为1 说明j不为冠军
isChampion = false;
break;
}
}
//如果冠军标识未改变则返回j
if (isChampion) {
return j;
}
}
return -1;
}
使用列做枚举判断
public int findChampion(int[][] grid) {
//初始化队伍个数及当前假设冠军=0
int n = grid.length,champion=0;
//遍历n个队伍依次查找是否存在最强队champion
for (int i = 0; i < n; i++) {
//根据grid判断是否有最强队champion,如果有则进行赋值
if(i!=champion && grid[i][champion] == 1){
// grid[i][champion] == 1,那么 i 队比 champion 队 强
// 将冠军变量更新为i
champion = i;
}
}
return champion;
}
运行结果如下:
(含有注释效果会低,去掉注释后内存由提升)
个人见解不喜勿喷!!!