1. 题目描述
2. 解题思路
(1) 统计每行1
的数目与每列1
的数目;
(2) 观察可知对于每一个为1
的坐标点所能构成的直角三角形的数目为
(f_row[i]-1)*(f_col[j]-1)
;
(3) 进一步优化,在当前行或列1
的数目为0时直接continue
。
3. 代码实现
class Solution {
public:
long long numberOfRightTriangles(vector<vector<int>>& grid) {
int row = grid.size();
int col = grid[0].size();
vector<int> f_row(row, 0);
vector<int> f_col(col, 0);
for (int i = 0; i < row; i++) {
for (int j = 0; j < col; j++) {
if (grid[i][j]) {
f_row[i]++;
f_col[j]++;
}
}
}
long long res = 0;
for (int i = 0; i < row; i++) {
if (f_row[i] < 1)
continue;
for (int j = 0; j < col; j++) {
if (f_col[j] < 1)
continue;
if (grid[i][j]) {
res += (f_row[i] - 1) * (f_col[j] - 1);
}
}
}
return res;
}
};