题目描述
给你一个二维 boolean 矩阵 grid 。
请你返回使用 grid 中的 3 个元素可以构建的 直角三角形 数目,且满足 3 个元素值 都 为 1 。
注意:
- 如果 grid 中 3 个元素满足:一个元素与另一个元素在 同一行,同时与第三个元素在 同一列 ,那么这 3 个元素称为一个 直角三角形 。这 3 个元素互相之间不需要相邻。
测试案例及提示
示例1:
输入:grid = [[0,1,0],[0,1,1],[0,1,0]]
输出:2
解释:
有 2 个直角三角形。
示例 2:
输入:grid = [[1,0,0,0],[0,1,0,1],[1,0,0,0]]
输出:0
解释:
没有直角三角形。
示例 3:
输入:grid = [[1,0,1],[1,0,0],[1,0,0]]
输出:2
解释:
有两个直角三角形。
解题思路
看题目理解题意
题目需要我们统计一个二维数组中的直角三角形数量,三角形的三点元素都为一。我们需要找到三个值为1的点,同时这三个点中需要满足一个元素与另一个元素在 同一行,同时与第三个元素在 同一列。
进一步分解问题
对于一个直角三角形,直角节点是唯一的,因此在寻找直角三角形的时候可以通过遍历直角节点,做到不重不漏。
对于一个直角节点来说,因为三角形的三个节点不需要相邻,因此在行中选取一个1,在列中再选取一个1,就可以组成直角三角形。
思路转换代码
先统计每行和每列中1的个数,使用两个数组存储。
遍历grid,对于每个值为1的,都统计以该节点为直角节点的直角三角形个数,不断加入答案中。
python
python
class Solution:
def numberOfRightTriangles(self, grid: List[List[int]]) -> int:
ans = 0
rows = len(grid)
cols = len(grid[0])
rowNum = [0] * rows
colNum = [0] * cols
for i in range(rows):
for j in range(cols):
if grid[i][j] == 1:
rowNum[i] += 1
colNum[j] += 1
for i in range(rows):
for j in range(cols):
if grid[i][j] == 1:
ans += (rowNum[i] - 1) * (colNum[j] - 1)
return ans