一、题目描述
给你一个二维 boolean 矩阵 grid 。
请你返回使用 grid 中的 3 个元素可以构建的 直角三角形 数目,且满足 3 个元素值 都 为 1 。
注意:
如果 grid 中 3 个元素满足:一个元素与另一个元素在 同一行,同时与第三个元素在 同一列 ,那么这 3 个元素称为一个 直角三角形 。这 3 个元素互相之间不需要相邻。
示例 1:
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
输入:grid = [[1,0,1],[1,0,0],[1,0,0]]
输出:2
解释:
有两个直角三角形。
二、解题思路
/**
* 解题思路:
* 1、因为要找直角三角形,也就是说我们要找直角的顶点,也就是数组的交点为1
* 2、先判断交点为1,然后找到交点为1所在的行的1的个数,然后再找到交点为1所在的列的1的个数
* 3、解决第2步的问题,我们可以将二维数组的行和列抽取出来成为两个一维数组
* 4、最后将每一行1的个数减去1 乘以 每一列1个数减1 最终得到结果(这个减去的1就是交点位置的1)
*/
三、示例代码
public static long numberOfRightTriangles(int[][] grid) {
//结果
long sum = 0;
//行数
int m = grid.length;
//列数
int n = grid[0].length;
//一维数组行
int[] row = new int[m];
//一维数组列
int[] col = new int[n];
for (int i = 0; i < m; i ++) {
for (int j = 0; j < n; j ++) {
//每行的j个数字相加,和为几,就代表每行有几个1
row[i] += grid[i][j];
//每列的i个数字相加,和为几,就代表每列有几个1
col[j] += grid[i][j];
}
}
for (int i = 0; i < m; i ++) {
for (int j = 0; j < n; j ++) {
//判断交点为1
if (grid[i][j] == 1) {
//将每一行1的个数减去1 乘以 每一列1个数减1 最终得到结果
sum += (row[i] - 1) * (col[j] - 1);
}
}
}
return sum;
}
public static void main(String[] args) {
int[][] grid = {{0,1,0},{0,1,1},{0,1,0}};
System.out.println(numberOfRightTriangles(grid));
}