角矩形的数量
难度:
标签:
题目描述
代码结果
运行时间: 77 ms, 内存: 17.2 MB
/*
* 思路:
* 1. 使用Java Stream API简化代码。
* 2. 遍历每一对行,计算每一列中同时为1的个数。
* 3. 使用组合数学计算每一对行之间形成的矩形的数量。
*/
import java.util.stream.IntStream;
public class CornerRectangles {
public int countCornerRectangles(int[][] grid) {
int m = grid.length;
int n = grid[0].length;
return IntStream.range(0, m)
.mapToObj(i -> i)
.flatMap(i -> IntStream.range(i + 1, m)
.mapToObj(j -> new int[]{i, j}))
.mapToInt(pair -> {
int i = pair[0];
int j = pair[1];
long pairCount = IntStream.range(0, n)
.filter(k -> grid[i][k] == 1 && grid[j][k] == 1)
.count();
return (int) (pairCount * (pairCount - 1) / 2);
})
.sum();
}
public static void main(String[] args) {
CornerRectangles solution = new CornerRectangles();
int[][] grid = {
{1, 0, 0, 1},
{0, 0, 1, 0},
{1, 0, 0, 1},
{1, 1, 1, 1}
};
System.out.println(solution.countCornerRectangles(grid)); // 输出: 1
}
}
解释
方法:
该题解使用了位运算和组合计数的思路。首先对每一行进行预处理,用一个整数 mask 记录该行哪些位置是1。然后利用位与运算,对于当前行 r,计算它与之前每一行 masks[i] (0<=i
时间复杂度:
O(m^2)
空间复杂度:
O(m)
代码细节讲解
🦆
在处理每一行的数据时,为什么选择使用整数掩码来表示行中1的位置,而不是直接使用行数组本身?
▷🦆
你提到利用位与运算来找出两行之间共同的1的位置,这种方法在哪些情况下可能会有性能瓶颈?
▷🦆
在计算角矩形的数量时,使用了组合计数公式,能否解释为什么选择组合计数来计算两行中公共1的位置可以形成的矩形数目?
▷🦆
算法中的`temp &= allMask`操作是如何帮助优化计算的?这里的`allMask`变量具体起到了什么作用?
▷