目标
给定一个 m x n 的二进制矩阵 mat,返回矩阵 mat 中特殊位置的数量。
如果位置 (i, j) 满足 mat[i][j] == 1 并且行 i 与列 j 中的所有其他元素都是 0(行和列的下标从 0 开始计数),那么它被称为 特殊 位置。
示例 1:

输入:mat = [[1,0,0],[0,0,1],[1,0,0]]
输出:1
解释:位置 (1, 2) 是一个特殊位置,因为 mat[1][2] == 1 且第 1 行和第 2 列的其他所有元素都是 0。
示例 2:

输入:mat = [[1,0,0],[0,1,0],[0,0,1]]
输出:3
解释:位置 (0, 0),(1, 1) 和 (2, 2) 都是特殊位置。
说明:
- m == mat.length
- n == mat[i].length
- 1 <= m, n <= 100
- mat[i][j] 是 0 或 1。
思路
返回二进制矩阵 mat 的特殊位置个数,所谓特殊位置指,当前位置的值为 1,且所在行列的其它元素均为 0。
计算每行每列中 1 的个数,如果当前单元格的值为 1,且行列 1 的个数也是 1,累加结果。
代码
/**
* @date 2026-03-04 9:50
*/
public class NumSpecial1582 {
public int numSpecial(int[][] mat) {
int m = mat.length, n = mat[0].length;
int[] rc = new int[m];
int[] cc = new int[n];
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
rc[i] += mat[i][j];
cc[j] += mat[i][j];
}
}
int res = 0;
for (int i = 0; i < m; i++) {
if (rc[i] > 1) {
continue;
}
for (int j = 0; j < n; j++) {
if (cc[j] == 1 && mat[i][j] == 1) {
res++;
}
}
}
return res;
}
}
性能
