题目描述:
给你一个二维 boolean 矩阵 grid
。请你返回使用 grid
中的 3 个元素可以构建的 直角三角形 数目,且满足 3 个元素值 都 为 1 。
注意:
- 如果
grid
中 3 个元素满足:一个元素与另一个元素在 同一行,同时与第三个元素在 同一列 ,那么这 3 个元素称为一个 直角三角形 。这 3 个元素互相之间不需要相邻
输入输出实例:
思路:其实对于这道题目,将问题转化一下,我们只需要遍历每行每列,找当前这个‘1’能组成多少个‘直角三角形’就可以了,而当前这个‘1’能构成的‘直角三角形’的数量就等于他所在的这一行的‘1’的数量减一(减去他自己)乘他所在的这一列的‘1’的数量减一,比如实例一的第二行第二列的‘1’由他为拐角的直角三角形的数量为2*1个,所以,我们先找到每行每列有多少个1,定义起始数量count=0然后遍历矩阵,将当前‘1’为拐角的直角三角形数量累加即可。根据上述思路,代码如下:
class Solution:
def numberOfRightTriangles(self, grid: List[List[int]]) -> int:
row_count = [0] * len(grid)
col_count = [0] * len(grid[0])
#找每行每列有多少个1
for i in range(len(grid)):
for j in range(len(grid[0])):
if grid[i][j] == 1 :
row_count[i] += 1
col_count[j] += 1
count = 0
for i in range(len(grid)):
for j in range(len(grid[0])):
if grid[i][j] == 1 :
#针对这一个元素,可以构成的直角三角形数量等于这一行1的个数乘这一列1的个数(除了自己)
count += (row_count[i] - 1) * (col_count[j] - 1)
return count