矩阵中 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的分布情况,还是仅仅基于位置和大小来计算?
▷🦆
算法中分割小矩形的sideLength是如何选择的?是否有特定的依据或是需要根据矩阵的宽度和高度动态调整?
▷🦆
代码中计算重复次数时,为什么行位置小于余数wr会导致重复次数增加一次?这样的逻辑是如何确定的?
▷🦆
在对数组a进行降序排序后选择前maxOnes个元素的和作为结果,这种方法是否总是能保证得到最大的1的数量?是否存在一种情况下其他未选取的组合可能有更多的1?
▷