一、题目
给你一个大小为 rows * cols
的矩阵 mat
,其中 mat[i][j]
是 0
或 1
,请返回 矩阵 mat
中特殊位置的数目 。
特殊位置 定义:如果 mat[i][j] == 1
并且第 i
行和第 j
列中的所有其他元素均为 0
(行和列的下标均 从 0 开始 ),则位置 (i, j)
被称为特殊位置。
二、示例
2.1> 示例 1:
【输入】mat = [
[1,0,0],
[0,0,1],
[1,0,0]]
【输出】1
【解释】(1,2) 是一个特殊位置,因为 mat[1][2] == 1 且所处的行和列上所有其他元素都是 0
2.2> 示例 2:
【输入】mat = [
[1,0,0],
[0,1,0],
[0,0,1]]
【输出】3 【解释】(0,0), (1,1) 和 (2,2) 都是特殊位置
2.3> 示例 3:
【输入】mat = [
[0,0,0,1],
[1,0,0,0],
[0,1,1,0],
[0,0,0,0]]
【输出】2
提示:
- rows == mat.length
- cols == mat[i].length
1
<= rows, cols <=100
- mat[i][j] 是
0
或1
三、解题思路
根据题目描述,我们首先需要对矩阵mat进行遍历,来判断哪个位置是“1”,这里,我们创建两个变量,分别是用来记录每行存在“1”的个数——int[] row
和每列存在“1”的个数——int[] column
;在这两个数组中,row[index]用来表示第index行有多少个“1”,column[index]用来表示第index列有多少个“1”。确定好只存在1个“1”的行号和列号之后,我们通过判断mat[i][j]是否等于“1”,如果等于,则总数加1,统计完毕后,将最终结果返回即可。
下面我们以mat = [[0,0,0,0,0,1,0,0],[0,0,0,0,1,0,0,1],[0,0,0,0,1,0,0,0],[1,0,0,0,1,0,0,0],[0,0,1,1,0,0,0,0]]
为例,我们对mat矩阵进行遍历,最终确定row=[0,2]
,column=[0,5,7]
,然后,我们来判断row和column组成的这6个点是否等于1。最终结果是只有mat[0][5]==1,所以,返回结果为1。具体操作,请见下图所示:
四、代码实现
class Solution {
public int numSpecial(int[][] mat) {
int[] row = new int[mat.length], column = new int[mat[0].length];
for (int i = 0; i < mat.length; i++) {
for (int j = 0; j < mat[i].length; j++) {
if (mat[i][j] == 1){
row[i] += 1;
column[j] +=1;
}
}
}
int result = 0;
for (int i = 0; i < row.length; i++) {
if (row[i] != 1) continue;
for(int j = 0; j < column.length; j++) {
if (column[j] != 1) continue;
if (mat[i][j] == 1) result++;
}
}
return result;
}
}
今天的文章内容就这些了:
写作不易,笔者几个小时甚至数天完成的一篇文章,只愿换来您几秒钟的 点赞 & 分享 。
更多技术干货,欢迎大家关注公众号“爪哇缪斯” ~ \(^o^)/ ~ 「干货分享,每天更新」