阅读量:0
一、题目描述
给你一个二维 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)); }