LCP 40. 心算挑战
题目链接
https://leetcode.cn/problems/right-triangles/
相关算法
哈希、数组、数学
题目描述
给你一个二维 boolean
矩阵 grid
。
请你返回使用 grid
中的 3
个元素可以构建的 直角三角形 数目,且满足 3
个元素值 都 为 1
。
注意:
如果 grid
中 3 个元素满足:一个元素与另一个元素在 同一行 ,同时与第三个元素在 同一列 ,那么这 3 个元素称为一个 直角三角形 。这 3 个元素互相之间不需要相邻。
- 数据范围:
1 <= grid.length <= 1000
1 <= grid[i].length <= 1000
0 <= grid[i][j] <= 1
解题思路
本题直角三角形 的表述看上去复杂,实际上很简单,即以一个元素作为三角形的角上的点,如果和这个元素的位置同行同列均有元素,就可以组成直角三角形。因此易得:位于坐标(x,y)处的元素可以构成(countX - 1)*(countY - 1)
个直角三角形
countX
和 countY
分别指代坐标(x,y)处行和列上值为 1 的元素个数
完整代码
java
class Solution {
public long numberOfRightTriangles(int[][] grid) {
int[] countX = new int[grid[0].length];
long res = 0;
for (int i = 0; i < grid.length; i++) {
for (int j = 0; j < grid[0].length; j++) {
countX[j] += grid[i][j];
}
}
for (int i = 0; i < grid.length; i++) {
int countY = 0;
for (int j = 0; j < grid[0].length; j++) {
countY += grid[i][j];
}
for (int j = 0; j < grid[0].length; j++) {
if (grid[i][j] == 1) {
res += (countX[j] - 1) * (countY - 1);
}
}
}
return res;
}
}
- 时间复杂度:
O(mn)
- 空间复杂度:
O(n)