本人算法萌新,为秋招找工作开始磨炼算法,算法题均用python实现,如果我有哪些地方做的有问题的,还请大家不吝赐教.
1.题干
给你一个二维 boolean 矩阵
grid
。请你返回使用
grid
中的 3 个元素可以构建的 直角三角形 数目,且满足 3 个元素值 都 为 1 。注意:
- 如果
grid
中 3 个元素满足:一个元素与另一个元素在 同一行,同时与第三个元素在 同一列 ,那么这 3 个元素称为一个 直角三角形 。这 3 个元素互相之间不需要相邻。示例 1:
0 1 0 0 1 1 0 1 0
0 1 0 0 1 1 0 1 0 输入:grid = [[0,1,0],[0,1,1],[0,1,0]]
输出:2
解释:
有 2 个直角三角形。
示例 2:
1 0 0 0 0 1 0 1 1 0 0 0 输入:grid = [[1,0,0,0],[0,1,0,1],[1,0,0,0]]
输出:0
解释:
没有直角三角形。
示例 3:
1 0 1 1 0 0 1 0 0
1 0 1 1 0 0 1 0 0 输入:grid = [[1,0,1],[1,0,0],[1,0,0]]
输出:2
解释:
有两个直角三角形。
提示:
1 <= grid.length <= 1000
1 <= grid[i].length <= 1000
0 <= grid[i][j] <= 1
2.思考
我的想法是依次遍历每个为1的点,然后找到他在横轴方向其他为1的点的数量,和纵轴方向其他为1点的数量,然后用乘法求出以该点为中间点能组成的直角三角形的数量.
3.代码
from typing import List
class Solution:
def numberOfRightTriangles(self, grid: List[List[int]]) -> int:
haves_x, haves_y = [], []
n1, n2 = len(grid), len(grid[0])
ans = 0
n_x, n_y = [0] * n1, [0] * n2
for i in range(n1):
for j in range(n2):
if grid[i][j] == 1:
haves_x.append(i)
haves_y.append(j)
n_x[i] += 1
n_y[j] += 1
n = len(haves_x)
for i in range(n):
x_num = n_x[haves_x[i]]
if x_num == 1:
continue
y_num = n_y[haves_y[i]]
if y_num == 1:
continue
ans += (x_num - 1) * (y_num - 1)
return ans
if __name__ == "__main__":
solution = Solution()
grid = [[0], [0]]
print(solution.numberOfRightTriangles(grid))
4.总结
本来没有设置n_x和n_y两个变量来存储该值的数量,后来用count直接查询发现会超时,然后就单独存储了一下每个值的数量