刷完LeetCode题库——1582. 二进制矩阵中的特殊位置

191 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第1天,点击查看活动详情

题目详情

LeetCode题库序号 1582. 二进制矩阵中的特殊位置 ,难度为 简单

Tag : 「模拟」 给你一个大小为 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

模拟

题解思路: 这道题目虽然是一道简单题,但是存在一定的解法技巧在里面,首先一个特殊位置,必须是行和列上都是只有他自身,并且自身是等于1的,由此,我们可以使用模拟遍历的方式,先把每一行和每一列存在1的数量进行计算,然后再进行一次变量。如果位置是特殊位置,并且在记录的行组里和列组里的值都是为1的话,那么这个位置就是真正的特殊位置。题目解法详情见以下代码:

题解代码

public class Solution {

        public int numSpecial(int[][] mat) {
            int m = mat.length;
            int n = mat[0].length;

            int[] mArr = new int[m];
            int[] nArr = new int[n];

            int ans = 0;
            for (int i = 0; i < m; i++) {
                for (int j = 0; j < n; j++) {
                    mArr[i] += mat[i][j];
                    nArr[j] += mat[i][j];
                }
            }

            for (int i = 0; i < m; i++) {
                for (int j = 0; j < n; j++) {
                    if (mat[i][j] == 1 && mArr[i] == 1 && nArr[j] == 1) {
                        ans++;
                    }
                }
            }

            return ans;
        }
}

结尾

我的"刷完LeetCode题库"系列文章的第 No.1582 序号的题目,本次刷题之旅系列开始于 2022-06-12,因为LeetCode上部分是有锁题,我自己的目标是将先把所有不带锁的题目刷完。自己能够通过这次刷题之旅勉励自己,并且提升逻辑思维能力。这个系列的文章就是会见证我自己的一个成长过程!

思路虽然不是最优的,但是我会尽我所能!

为了让我自己的刷题之旅不中断,我特地建立了相关的仓库,来记录我自己的刷题之旅。 github.com/jackpan123/…