给你一个大小为 rows * cols 的矩阵 mat,其中 mat[i][j] 是 0 或 1,请返回 矩阵 mat 中特殊位置的数目 。
特殊位置 定义:如果 mat[i][j] == 1 并且第 i 行和第 j 列中的所有其他元素均为 0(行和列的下标均 从 0 开始 ),则位置 (i, j) 被称为特殊位置。
【输入】mat = [
[1,0,0],
[0,0,1],
[1,0,0]]
【输出】1
【解释】(1,2) 是一个特殊位置,因为 mat[1][2] == 1 且所处的行和列上所有其他元素都是 0
【输入】mat = [
[1,0,0],
[0,1,0],
[0,0,1]]
【输出】3 【解释】(0,0), (1,1) 和 (2,2) 都是特殊位置
【输入】mat = [
[0,0,0,1],
[1,0,0,0],
[0,1,1,0],
[0,0,0,0]]
【输出】2
1 <= rows, cols <= 1000 或 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^)/ ~ 「干货分享,每天更新」