1582. 二进制矩阵中的特殊位置
一、题目
1.题目描述
给你一个大小为 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
2.基础框架
C++基础框架代码如下:
int numSpecial(vector<vector<int>>& mat) {
}
3.解题思路
- 题目分析
-
题目目标返回mat数组中特殊位置的个数。
-
特殊位置的定义:同一行且同一列中只有一个
1
。 -
当遍历第
i
行的时候,有四种情况:① 不存在值为1的情况,即第
i
行元素的值全为0
,进入下一行。② 存在2个列的值为1的情况,那么该行不存在特殊位置,直接进入下一行。
③ 该行只有1个列的值为
1
,遍历n
行同一列的元素,同一列中存在其他元素值也为1
的情况,那么该列不存在特殊值,进入下一行。④ 该行只有一个元素值为1,且该元素值同一列中的其他元素都不为1,计数器
cnt++
。
-
实现代码:
int numSpecial(vector<vector<int>>& mat) { int n = mat.size(); int m = mat[0].size(); int i, j, k; int ans = 0; for (i = 0; i < n; i++) { int tmp = 0; int pos = 0; for (j = 0; j < m; j++) { if (mat[i][j] == 1) { ++tmp; pos = j; } if (tmp > 1) break; } if (tmp > 1 || tmp == 0) continue; tmp = 0; for (k = 0; k < n; k++) { if (mat[k][pos] == 1) ++tmp; if (tmp > 1) break; } if (tmp == 1) ++ans; } return ans; }