方法一 模拟
先把矩阵每一行和每一列中1的数量统计出来,然后遍历矩阵,元素为1的位置看他所在的行和列的1的数量是否都为1即为满足题意的点
var numSpecial = function(mat) {
let m = mat.length, n = mat[0].length
let rows = new Array(m).fill(0)
let cols = new Array(n).fill(0)
for (let i = 0; i < m; i++) {
for (let j = 0; j < n; j++) {
rows[i] += mat[i][j]
cols[j] += mat[i][j]
}
}
let res = 0
for (let i = 0; i < m; i++) {
for (let j = 0; j < n; j++) {
if (mat[i][j] === 1 && rows[i] === 1 && cols[j] === 1) {
res++
}
}
}
return res
};
消耗时间和内存情况:
方法二 列的标记值
统计每一行1的频次,然后在第一行对应列加上这个频次,如果当前行是第一行,避免重复统计需要减1
作者:力扣官方题解
链接:leetcode.1582二进制矩阵中的特殊位置
var numSpecial = function(mat) {
const m = mat.length, n = mat[0].length;
for (let i = 0; i < m; i++) {
let cnt1 = 0;
for (let j = 0; j < n; j++) {
if (mat[i][j] === 1) {
cnt1++;
}
}
if (i === 0) {
cnt1--;
}
if (cnt1 > 0) {
for (let j = 0; j < n; j++) {
if (mat[i][j] === 1) {
mat[0][j] += cnt1;
}
}
}
}
let sum = 0;
for (const num of mat[0]) {
if (num === 1) {
sum++;
}
}
return sum;
};
消耗时间和内存情况: