这一题,就要仔细理解题目了,我就是没有理解。。。
刚开始我以为是要连续的1,形成一片,类似于岛屿的题目一样,那样构成的才算一个三角形,只不过在这里,不需要连续也ok,只要符合要求,在同一行,同一列有1就ok
如下图,这里不需要连续的1也可以构成,绿色还有蓝色框,构成了两个直角三角形
所以,这里理解到了如何构成的,就比较好处理这一题了。
如果在某一点有 grid[i][j] === 1,那么此时我们寻找同一行,同一列是否存在1即可,如果同时存在,那么就能构成直角三角形。
此时的问题就变成了,如何计算有多少个直角三角形,在这个问题上,也比较好处理。这就是一个乘法问题了,如果在grid[i][j] === 1这里,同一列上有3个1,同一行上有2个1,那么除开本身,同一列上就有2个1,同一行上就有1个1,所以此时显而易见就只有2个三角形了,也就是上图中的情况。
由此可得,我们计算在grid[i][j] === 1上有多少个直角三角形,就可以转化成,同一行同一列上有多少个1,然后想乘即可(要除开本身)
var numberOfRightTriangles = function (grid) {
let res = 0
let rowNum = grid.length
let colNum = grid[0].length
let row = new Array(rowNum).fill(0) // 统计在第 i 行上有多少个 1
let col = new Array(colNum).fill(0) // 统计在第 j 列上有多少个 1
for (let i = 0; i < rowNum; ++i) {
for (let j = 0; j < colNum; ++j) {
row[i] += grid[i][j]
col[j] += grid[i][j]
}
}
for (let i = 0; i < rowNum; ++i) {
for (let j = 0; j < colNum; ++j) {
if (grid[i][j] === 1) {
// 除开本身,然后想乘
// 即可得到在 [i,j] 点处可以构成多少个直角三角形
res += (row[i] - 1) * (col[j] - 1)
}
}
}
return res
};