LeetCode-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 队强
解题思路一:找到没有1存在的列即可。
如果第 j 列的元素值都是 0,说明没有队伍可以击败 j 队,j 队是冠军。
python
class Solution:
def findChampion(self, grid: List[List[int]]) -> int:
n = len(grid)
for j in range(n):
flag = False
for i in range(n):
if grid[i][j] == 1:
flag = True
break
if not flag:
return j
return n-1
# 同意
class Solution:
def findChampion(self, grid: List[List[int]]) -> int:
for j, col in enumerate(zip(*grid)):
if 1 not in col:
return j
时间复杂度:O(n^2^)
空间复杂度:O(1)
解题思路二:找到和等于n-1的行。
python
class Solution:
def findChampion(self, grid: List[List[int]]) -> int:
for i, row in enumerate(grid):
if sum(row) == len(grid) - 1:
return i
时间复杂度:O(n^2^)
空间复杂度:O(1)
解题思路三:打擂台【时间复杂度:O(n)】
python
class Solution:
def findChampion(self, grid: List[List[int]]) -> int:
ans = 0
for i, row in enumerate(grid):
if row[ans]:
ans = i
return ans
时间复杂度:O(n)
空间复杂度:O(1)