【leetcode】3128.直角三角形

88 阅读2分钟

leetcode-3128.png

这一题,就要仔细理解题目了,我就是没有理解。。。
刚开始我以为是要连续的1,形成一片,类似于岛屿的题目一样,那样构成的才算一个三角形,只不过在这里,不需要连续也ok,只要符合要求,在同一行,同一列有1就ok

如下图,这里不需要连续的1也可以构成,绿色还有蓝色框,构成了两个直角三角形
sample.png

所以,这里理解到了如何构成的,就比较好处理这一题了。
如果在某一点有 grid[i][j] === 1,那么此时我们寻找同一行,同一列是否存在1即可,如果同时存在,那么就能构成直角三角形。
此时的问题就变成了,如何计算有多少个直角三角形,在这个问题上,也比较好处理。这就是一个乘法问题了,如果在grid[i][j] === 1这里,同一列上有31,同一行上有21,那么除开本身,同一列上就有21,同一行上就有11,所以此时显而易见就只有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
};