leetcode
leetcode 2301 ~ 2350
一最多的行

一最多的行

难度:

标签:

题目描述

Given a m x n binary matrix mat, find the 0-indexed position of the row that contains the maximum count of ones, and the number of ones in that row.

In case there are multiple rows that have the maximum count of ones, the row with the smallest row number should be selected.

Return an array containing the index of the row, and the number of ones in it.

 

Example 1:

Input: mat = [[0,1],[1,0]]
Output: [0,1]
Explanation: Both rows have the same number of 1's. So we return the index of the smaller row, 0, and the maximum count of ones (1). So, the answer is [0,1]. 

Example 2:

Input: mat = [[0,0,0],[0,1,1]]
Output: [1,2]
Explanation: The row indexed 1 has the maximum count of ones (2). So we return its index, 1, and the count. So, the answer is [1,2].

Example 3:

Input: mat = [[0,0],[1,1],[0,0]]
Output: [1,2]
Explanation: The row indexed 1 has the maximum count of ones (2). So the answer is [1,2].

 

Constraints:

  • m == mat.length 
  • n == mat[i].length 
  • 1 <= m, n <= 100 
  • mat[i][j] is either 0 or 1.

代码结果

运行时间: 32 ms, 内存: 16.5 MB


/*
 * 题目思路:
 * 使用Java Stream API来简化代码,通过流的操作计算每一行中1的数量,找出包含最多1的行的下标和1的数量。
 */
import java.util.*;
import java.util.stream.*;

public class Solution {
    public int[] findMaxOnesRow(int[][] mat) {
        return IntStream.range(0, mat.length)
                .mapToObj(i -> new int[]{i, (int) Arrays.stream(mat[i]).filter(x -> x == 1).count()})
                .max(Comparator.comparingInt(a -> a[1]))
                .orElse(new int[]{-1, 0});
    }
}

解释

方法:

题解的核心思想是遍历矩阵的每一行,计算每行中1的数量,同时跟踪记录最大1的数量及其对应的行索引。如果发现有行1的数量大于当前记录的最大数量,则更新最大数量和行索引。最后返回包含最大1数量的行的索引和1的数量。这种方法直接遍历矩阵,计算每行的1的总数,并实时更新最大值和对应的行索引。

时间复杂度:

O(m * n)

空间复杂度:

O(1)

代码细节讲解

🦆
为什么这个算法选择遍历整个矩阵来计算每一行的1的数量,而不是使用更高效的方法,比如二分查找,尤其是在行已经排序的情况下?
这个算法选择遍历整个矩阵计算每一行的1的数量,主要是因为它不依赖于行中数据的排序状态。虽然二分查找在已排序的行中可以更快地找到1的数量,但这需要额外的条件:每行必须是排序的。对于未排序的行,二分查找将不适用。此外,二分查找虽然可以加速单行的查找过程,但整体上仍然需要遍历每一行,时间复杂度在最坏情况下仍然接近O(n*m)(n为行数,m为行的最大长度)。因此,直接遍历整个矩阵是一种更通用且在未排序数据中有效的方法。
🦆
如果矩阵中的每一行的长度不相同,这个算法还能否工作?需要做哪些调整来适应这种情况?
当前算法假设矩阵的每一行长度相同,因此直接使用sum函数来计算每行1的数量。如果矩阵行的长度不同,算法本身不需要做根本性的更改,因为Python的sum函数可以正常处理不同长度的行。但是,为了保持代码的健壮性,可以在实现时添加一些检查,确保不同长度的行被正确处理,例如检查每一行的数据类型和结构是否符合预期。
🦆
在比较行中1的数量时,如果有多行1的数量相同,算法是如何确保返回最小的行索引的?这部分逻辑在代码中是如何实现的?
在提供的代码实现中,当找到具有更多1的新行时,会更新最大1的数量及其对应的行索引。如果后续行的1数量与当前最大数量相同,算法不会更新行索引。因此,只有当找到的1数量严格大于当前记录的最大数量时,行索引才会更新。这确保了如果有多行具有相同的最大1数量,返回的是第一次达到该数量的行的索引,即最小的行索引。
🦆
当前算法在处理包含大量0的稀疏矩阵时的性能如何?是否有针对稀疏矩阵优化的方法可以提高效率?
当前算法对于稀疏矩阵(即大多数元素为0的矩阵)依然需要遍历所有元素,因此效率不是最优的。针对稀疏矩阵,可以考虑使用更适合稀疏数据的数据结构,如压缩行存储(Compressed Row Storage, CRS)或使用字典来记录每一行中1的位置,从而避免遍历大量的0。这样,计算每行中1的数量可以更加高效,因为只需要计算存储的非零元素数量。

相关问题