文章

[LeetCode] 每日一题 2643. 一最多的行(简单题)

题目链接

https://leetcode.cn/problems/row-with-maximum-ones

题目描述

给你一个大小为 m x n 的二进制矩阵 mat ,请你找出包含最多 1 的行的下标(从 0 开始)以及这一行中 1 的数目。

如果有多行包含最多的 1 ,只需要选择 行下标最小 的那一行。

返回一个由行下标和该行中 1 的数量组成的数组。

示例输入

示例 1

输入:mat = [[0,1],[1,0]]
输出:[0,1]
解释:两行中 1 的数量相同。所以返回下标最小的行,下标为 0 。该行 1 的数量为 1 。所以,答案为 [0,1] 。 

示例 2

输入:mat = [[0,0,0],[0,1,1]]
输出:[1,2]
解释:下标为 1 的行中 1 的数量最多。该行 1 的数量为 2 。所以,答案为 [1,2] 。

示例 3

输入:mat = [[0,0],[1,1],[0,0]]
输出:[1,2]
解释:下标为 1 的行中 1 的数量最多。该行 1 的数量为 2 。所以,答案为 [1,2] 。

提示

  • m == mat.length 

  • n == mat[i].length 

  • 1 <= m, n <= 100 

  • mat[i][j]01

解题思路

这道题非常基础,遍历矩阵的每一行,统计其中 1 的数量,并记录 1 最多的行索引。如果发现当前行的 1 数量超过了之前记录的最大值,就更新结果。因为题目要求在多个最大值行时选择索引最小的行,我们只需要在发现更大 1 数量时更新即可,不需要额外处理相等情况

代码实现

class Solution {
    public int[] rowAndMaximumOnes(int[][] mat) {
        int[] ans = new int[] { 0, 0 };
        for (int i = 0; i < mat.length; i++) {
            int count = 0;
            for (int j = 0; j < mat[0].length; j++) {
                if (mat[i][j] == 1) {
                    count++;
                }
            }
            if (count > ans[1]) {
                ans[0] = i;
                ans[1] = count;
            }
        }
        return ans;
    }
}

复杂度分析

  • 时间复杂度O(m * n),其中 m 是矩阵的行数,n 是列数。我们需要遍历整个矩阵,因此时间复杂度是 O(m * n)

  • 空间复杂度O(1),仅使用了常数级别的额外空间存储结果数组

总结

这道题思路清晰,直接遍历矩阵统计 1 的数量,并实时更新答案。没有复杂的数据结构或算法

希望这篇分享能为你带来启发!如果你有任何问题或建议,欢迎在评论区留言,与我共同交流探讨。

License:  CC BY 4.0