题目描述:
一场比赛中共有 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 队将会是 冠军 。
返回这场比赛中将会成为冠军的队伍。
题目分析:
方法一:
使用for循环遍历所有的i,在定义max找到每次循环中较大的组,直至遍历结束,最后返回冠军组max;
class Solution {
public:
int findChampion(vector<vector<int>>& grid) {
int size = grid.size();
int max = 0;
for (int i = 0; i < size; i++) {
if (grid[i][max] == 1) {
max = i;
}
}
return max;
}
};
方法二:
如果队伍 i是冠军,则grid[i][i]==1,其余j等于任何值,grid[i][j]==1,所以 sum(grid[i])=n−1;
class Solution {
public:
int findChampion(vector<vector<int>>& grid) {
int size = grid.size();
for (int i = 0; i < size; i++) {
if (accumulate(grid[i].begin(), grid[i].end(), 0) == size - 1) {
return i;
}
}
return -1;
}
};
其中使用了C++标准库中的accumulate函数,用于将指定范围内的元素累积求和。
语法如下:
template< class InputIt, class T >
T accumulate( InputIt first, InputIt last, T init );
其中:
- InputIt 是迭代器的类型,指向需要累积的元素范围。
- first 表示累积范围的起始位置的迭代器。
- last 表示累积范围的终止位置的迭代器。注意:该迭代器指向累积范围之外的位置。
- init 是累积的初始值。
在代码中,accumulate(grid[i].begin(), grid[i].end(), 0) 的作用是计算grid[i]中所有元素的和,并且和这个值比较是否等于size - 1。