给你一个大小为 rows x cols 的矩阵 mat,其中 mat[i][j] 是 0 或 1,请返回 矩阵 mat 中特殊位置的数目 。
特殊位置 定义:如果 mat[i][j] == 1 并且第 i 行和第 j 列中的所有其他元素均为 0(行和列的下标均 从 0 开始 ),则位置 (i, j) 被称为特殊位置。
示例 1:
输入:mat = [[1,0,0],
[0,0,1],
[1,0,0]]
输出:1
解释:(1,2) 是一个特殊位置,因为 mat[1][2] == 1 且所处的行和列上所有其他元素都是 0
示例 2:
输入:mat = [[1,0,0],
[0,1,0],
[0,0,1]]
输出:3
解释:(0,0), (1,1) 和 (2,2) 都是特殊位置
示例 3:
输入:mat = [[0,0,0,1],
[1,0,0,0],
[0,1,1,0],
[0,0,0,0]]
输出:2
示例 4: 输入:mat = [[0,0,0,0,0],
[1,0,0,0,0],
[0,1,0,0,0],
[0,0,1,0,0],
[0,0,0,1,1]]
输出:3
提示:
rows == mat.length
cols == mat[i].length
1 <= rows, cols <= 100
mat[i][j] 是 0 或 1
var numSpecial = function(mat) {
const m = mat.length, n = mat[0].length
const rows = new Uint8Array(m), cols = new Uint8Array(n)
for (let i = 0; i < m; i++) {
for (let j = 0; j < n; j++) {
if (mat[i][j] === 1) rows[i]++, cols[j]++
}
}
let r = 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) r++
}
}
return r
};
function numSpecial(mat: number[][]): number {
const m = mat.length, n = mat[0].length
const rows = new Uint8Array(m), cols = new Uint8Array(n)
for (let i = 0; i < m; i++) {
for (let j = 0; j < n; j++) {
if (mat[i][j] === 1) rows[i]++, cols[j]++
}
}
let r = 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) r++
}
}
return r
};
class Solution {
function numSpecial($mat) {
$m = count($mat);
$n = count($mat[0]);
$rows = array_fill(0, $m, 0);
$cols = array_fill(0, $n, 0);
foreach ($mat as $i => $row) {
foreach ($row as $j => $v) {
if ($v === 1) {
$rows[$i]++;
$cols[$j]++;
}
}
}
$r = 0;
foreach ($mat as $i => $row) {
foreach ($row as $j => $v) {
if ($v === 1 && $rows[$i] === 1 && $cols[$j] === 1) $r++;
}
}
return $r;
}
}
func numSpecial(mat [][]int) int {
m, n, r := len(mat), len(mat[0]), 0
rows, cols := make([]int, m), make([]int, n)
for i, row := range mat {
for j, v := range row {
if v == 1 {
rows[i]++
cols[j]++
}
}
}
for i, row := range mat {
for j, v := range row {
if v == 1 && rows[i] == 1 && cols[j] == 1 {
r++
}
}
}
return r
}
class Solution {
public int numSpecial(int[][] mat) {
int m = mat.length, n = mat[0].length, r = 0;
int[] rows = new int[m], cols = new int[n];
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
if (mat[i][j] == 1) {
rows[i]++;
cols[j]++;
}
}
}
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
if (mat[i][j] == 1 && rows[i] == 1 && cols[j] == 1) r++;
}
}
return r;
}
}
public class Solution {
public int NumSpecial(int[][] mat) {
int m = mat.Length, n = mat[0].Length, r = 0;
int[] rows = new int[m], cols = new int[n];
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
if (mat[i][j] == 1) {
rows[i]++;
cols[j]++;
}
}
}
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
if (mat[i][j] == 1 && rows[i] == 1 && cols[j] == 1) {
r++;
}
}
}
return r;
}
}
int numSpecial(int** mat, int matSize, int* matColSize){
int* rows = malloc(sizeof(int) * matSize);
memset(rows, 0, sizeof(int) * matSize);
int* cols = malloc(sizeof(int) * *matColSize);
memset(cols, 0, sizeof(int) * *matColSize);
for (int i = 0; i < matSize; i++) {
for (int j = 0; j < *matColSize; j++) {
if (mat[i][j]) rows[i]++, cols[j]++;
}
}
int r = 0;
for (int i = 0; i < matSize; i++) {
for (int j = 0; j < *matColSize; j++) {
if (mat[i][j] && rows[i] == 1 && cols[j] == 1) r++;
}
}
return r;
}
class Solution {
public:
int numSpecial(vector<vector<int>>& mat) {
int m = mat.size(), n = mat[0].size(), r = 0;
vector<int> rows(m, 0);
vector<int> cols(n, 0);
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
if (mat[i][j]) rows[i]++, cols[j]++;
}
}
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
if (mat[i][j] && rows[i] == 1 && cols[j] == 1) r++;
}
}
return r;
}
};
class Solution:
def numSpecial(self, mat: List[List[int]]) -> int:
rows, cols, r = [0] * len(mat), [0] * len(mat[0]), 0
for i, row in enumerate(mat):
for j, v in enumerate(row):
if v == 1: rows[i], cols[j] = rows[i] + 1, cols[j] + 1
for i, row in enumerate(mat):
for j, v in enumerate(row):
if v == 1 and rows[i] == 1 and cols[j] == 1: r += 1
return r
class Solution:
def numSpecial(self, mat: List[List[int]]) -> int:# zip
rows, cols, r = [sum(row) for row in mat], [sum(col) for col in zip(*mat)], 0
for i, row in enumerate(mat):
for j, v in enumerate(row):
if v and rows[i] == 1 and cols[j] == 1: r += 1
return r
第 0 行存 每一行中 1 的数量
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) continue
for (let j = 0; j < n; j++) {
if (mat[i][j] === 1) mat[0][j] += cnt1
}
}
let r = 0
for (let j = 0; j < n; j++) if (mat[0][j] === 1) r++
return r
};
function numSpecial(mat: number[][]): number {
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) continue
for (let j = 0; j < n; j++) {
if (mat[i][j] === 1) mat[0][j] += cnt1
}
}
let r = 0
for (let j = 0; j < n; j++) if (mat[0][j] === 1) r++
return r
};
class Solution {
function numSpecial($mat) {
foreach ($mat as $i => $row) {
$cnt1 = 0;
foreach ($row as $v) {
if ($v === 1) $cnt1++;
}
if ($i === 0) $cnt1--;
if ($cnt1 === 0) continue;
foreach ($row as $j => $v) {
if ($v === 1) $mat[0][$j] += $cnt1;
}
}
$r = 0;
foreach ($mat[0] as $v) if ($v === 1) $r++;
return $r;
}
}
func numSpecial(mat [][]int) int {
for i, row := range mat {
cnt1 := 0
for _, v := range row {
if v == 1 {
cnt1++
}
}
if i == 0 {
cnt1--
}
if cnt1 == 0 {
continue
}
for j, v := range row {
if v == 1 {
mat[0][j] += cnt1
}
}
}
r := 0
for _, v := range mat[0] {
if v == 1 {
r++
}
}
return r
}
class Solution {
public int numSpecial(int[][] mat) {
int m = mat.length, n = mat[0].length, r = 0;
for (int i = 0; i < m; i++) {
int cnt1 = 0;
for (int j = 0; j < n; j++) {
if (mat[i][j] == 1) cnt1++;
}
if (i == 0) cnt1--;
if (cnt1 == 0) continue;
for (int j = 0; j < n; j++) {
if (mat[i][j] == 1) mat[0][j] += cnt1;
}
}
for (int v : mat[0]) if (v == 1) r++;
return r;
}
}
public class Solution {
public int NumSpecial(int[][] mat) {
int m = mat.Length, n = mat[0].Length, r = 0;
for (int i = 0; i < m; i++) {
int cnt1 = 0;
for (int j = 0; j < n; j++) {
if (mat[i][j] == 1) cnt1++;
}
if (i == 0) cnt1--;
if (cnt1 == 0) continue;
for (int j = 0; j < n; j++) {
if (mat[i][j] == 1) mat[0][j] += cnt1;
}
}
foreach (int v in mat[0]) if (v == 1) r++;
return r;
}
}
int numSpecial(int** mat, int matSize, int* matColSize){
for (int i = 0; i < matSize; i++) {
int cnt1 = 0;
for (int j = 0; j < *matColSize; j++) {
if (mat[i][j]) cnt1++;
}
if (i == 0) cnt1--;
if (cnt1 == 0) continue;
for (int j = 0; j < *matColSize; j++) {
if (mat[i][j]) mat[0][j] += cnt1;
}
}
int r = 0;
for (int j = 0; j < *matColSize; j++) if (mat[0][j] == 1) r++;
return r;
}
class Solution {
public:
int numSpecial(vector<vector<int>>& mat) {
int m = mat.size(), n = mat[0].size(), r = 0;
for (int i = 0; i < m; i++) {
int cnt1 = 0;
for (int v : mat[i]) if (v) cnt1++;
if (i == 0) cnt1--;
if (cnt1 == 0) continue;
for (int j = 0; j < n; j++) if (mat[i][j]) mat[0][j] += cnt1;
}
for (int v : mat[0]) if (v == 1) r++;
return r;
}
};
class Solution:
def numSpecial(self, mat: List[List[int]]) -> int:
for i, row in enumerate(mat):
cnt1 = sum(v == 1 for v in row) - (i == 0)
if cnt1 == 0: continue
for j, v in enumerate(row):
if v: mat[0][j] += cnt1
return sum(v == 1 for v in mat[0])