leetcode
leetcode 1001 ~ 1050
矩阵中 1 的最大数量

矩阵中 1 的最大数量

难度:

标签:

题目描述

代码结果

运行时间: 27 ms, 内存: 16.2 MB


/*
 * 题目思路:
 * 给定一个 m x n 的矩阵,其中矩阵的元素值为 0 或 1。
 * 我们需要找到矩阵中每行和每列都至少包含一个 1 的最大数量。
 * 这意味着我们要尽可能多地在矩阵中放置 1,但不能违反行和列的限制。
 */

import java.util.stream.IntStream;

public class Solution {
    public int maximumOnes(int[][] matrix) {
        int m = matrix.length;
        int n = matrix[0].length;
        int[] rowSum = new int[m];
        int[] colSum = new int[n];

        // 计算每行和每列中的 1 的数量
        IntStream.range(0, m).forEach(i ->
            IntStream.range(0, n).forEach(j -> {
                if (matrix[i][j] == 1) {
                    rowSum[i]++;
                    colSum[j]++;
                }
            })
        );

        // 统计行和列中 1 的最大数量
        long maxOnes = IntStream.range(0, m).flatMap(i ->
            IntStream.range(0, n).filter(j ->
                matrix[i][j] == 1 && rowSum[i] > 1 && colSum[j] > 1
            )
        ).count();

        return (int) maxOnes;
    }
}

解释

方法:

该题解的核心思路是通过计算每个小矩形内1的可能数量来确定整个矩阵中1的最大数量。首先,算法将矩阵分割为边长为sideLength的小矩形,并计算这些小矩形完整填充大矩阵的次数(整除部分),以及边缘可能多出来的部分(余数部分)。对于每一个可能的位置(r, c),算法计算出这个位置在所有小矩形中出现的次数(这取决于它是否位于边缘部分)。然后将所有这些计数存入数组a,并对数组a进行降序排序,最后选取前maxOnes个元素的和,作为结果返回,这是因为我们想要最大化矩阵中1的数量,而每个位置的贡献是不一样的。

时间复杂度:

O(sideLength^2 * log(sideLength^2))

空间复杂度:

O(sideLength^2)

代码细节讲解

🦆
在计算每个小矩形内1的可能数量时,是否考虑了矩阵中实际的1的分布情况,还是仅仅基于位置和大小来计算?
算法仅基于位置和大小来计算每个小矩形内1的可能数量,而并没有考虑矩阵中实际的1的分布情况。这种方法基于统计和概率的假设,即每个位置的1的出现概率是均等的,因此可以通过计算每个位置在小矩形中的出现次数来估算它的总贡献。
🦆
算法中分割小矩形的sideLength是如何选择的?是否有特定的依据或是需要根据矩阵的宽度和高度动态调整?
题解中并未详细说明sideLength的选择方法,通常这种参数的选择依赖于具体问题的需求和矩阵的尺寸。sideLength可能是一个预设的参数,或者需要通过实验和优化来确定最适合问题的值。在不同的宽度和高度下,可能需要调整sideLength以达到最佳的性能或结果。
🦆
代码中计算重复次数时,为什么行位置小于余数wr会导致重复次数增加一次?这样的逻辑是如何确定的?
这种逻辑基于整除和余数的计算。当矩阵的宽度或高度不能被sideLength完全整除时,边缘会有剩余的部分。如果行位置r小于余数wr,意味着这一行在边缘的额外部分中,因此它会多填充一次,从而增加一次重复次数。这确保了每个位置的出现次数准确反映了其在整个矩阵中被小矩形覆盖的次数。
🦆
在对数组a进行降序排序后选择前maxOnes个元素的和作为结果,这种方法是否总是能保证得到最大的1的数量?是否存在一种情况下其他未选取的组合可能有更多的1?
这种方法在假设每个位置的1出现概率相等时,能够尽可能地获取最大数量的1。然而,如果实际的1的分布不均或有特定的模式,则仅选择出现次数最多的位置可能不会总是得到最大的1的数量。在某些特殊情况下,其他未选取的组合可能由于分布的特性而包含更多的1。因此,这种方法最适用于1的分布相对均匀的情况。

相关问题