2923. 找到冠军 I

文章访问量:

遍历数组

https://leetcode.cn/problems/find-champion-i/description/

二维数组的遍历。时间复杂度n2。不确定能不能只用一次循环就做出来。

Go
func findChampion(grid [][]int) int {
    team_num:=len(grid)
    team:=make([]int,team_num)
    for i:=0;i<team_num;i++{
        for j:=0;j<team_num;j++{
            if grid[i][j]==1{
                team[j]=1
            }
        }
    }
    for i:=0;i<team_num;i++{
        if team[i]==0{
            return i
        }
    }
    return -1
}

然后看了看别人的题解,发现时间复杂度为n的思路之前在哪见过。

https://white-night.club/index.php/2023/11/19/ad158/

Go
func findChampion(grid [][]int) int {
    result:=0
    for i:=1;i<len(grid);i++{
        if grid[i][result]==1{
            result=i
        }
    }
    return result
}

遍历一次就行。这个思路也不会出现“错过”的情况,毕竟用嵌套循环就是为了遍历所有数组,防止“错过”某个数据。接下来解释下为什么不会“错过”。

首先是对角线,因为x队不可能比它自己强,所以像[0][0],[1][1]这种在对角线上的肯定全为0。再然后是“反转”,如果[0][1]=0,那么[1][0]一定为1。而我们要找的就是只有对角线上的元素[x][x]=0的数组,也就是说这个数组的和为n-1。

再给个样例方便理解。可以看得出来,这个矩阵是上下反转的,即条件:对于满足 i != j 的所有 i, j ,grid[i][j] != grid[j][i] 均成立

而且由于条件:生成的输入满足:如果 a 队比 b 队强,b 队比 c 队强,那么 a 队比 c 队强,所以一定有一队是最弱的,即数组和为0。

还是这个样例,先假设队伍0是最强的,那么[1][0]=0,不符合,所以队伍1是最强的。

再往下看,如果队伍1是最强的,那么[2][1]=0,符合,所以队伍1还是最强的。

最后一组,[3][1]=1,所以队伍3比队伍1强,那么队伍3是最强的。

又由于队伍1比队伍0和队伍2都强,那么[3][0]和[3][2]的数据实际上我们可以直接忽略掉不看。相当于两两比较找更强的,那么最后留下的那个一定是最强的。这也是为什么只用一次循环就能搞定的原因。

Subscribe
提醒
0 评论
Inline Feedbacks
View all comments
0
在此留下你的评论x