或许是昨天的每日一题太难了,今天的简单
题型:数组、矩阵
链接:2923. 找到冠军 I - 力扣(LeetCode)
来源:LeetCode
题目描述
一场比赛中共有 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
队强
题目思路
对于简单题,不单单是做出来,还要有多种思路
乍一看是矩阵问题:index为 i 的行代表 i 组的比赛情况。比赛非赢即输的情况下,冠军就是全胜——即除了对角线元素,全为 1 的那个队伍。那么统计每行的1的个数,如果为n - 1,那就是冠军
基于这种 n - 1 个 1 和这个矩阵上三角矩阵的特点(比如说a[2][3] = 1的话,a[3][2] = 0,因为2赢了3,3就必须输给2)就可以采用一种【胜者守擂】的思路:输了的一定不是冠军,所以冠军只能是【擂主】或者是【打擂】。擂主一旦输了,就让打擂当擂主。最终擂台上的就是冠军
C++代码
暴力
class Solution {
public:int findChampion(vector<vector<int>>& grid) {// n*n的二维数组 grid[i][k] = 1: i > k// 对角线的元素必然是0// 非赢即输:所以: 除了对角线,某一行全是1 说明这一行是冠军int ans = 0;for(int i=0;i<grid.size();++i){int sum = 0;for(int num : grid[i]){if(num == 1)sum++;}if(sum == grid.size()-1){ans = i;break;}}return ans;}
};
一次遍历
class Solution {
public:int findChampion(vector<vector<int>>& grid) {// 一次遍历int winner = 0;for(int i = 1;i < grid.size();++i){if(grid[winner][i] == 0)//如果输了winner = i;}return winner;}
};