1582. 二进制矩阵中的特殊位置(模拟法)

109 阅读3分钟

image.png

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

测试岗位也越来卷了,除了基本的功能测试外,还要有编程基础、脚本经验才脱颖而出。

怎么才能提高我们的编程能力呢,刷LeetCode是最佳的途径之一,话不多数,刷题走起~

一、题目描述:

  • 题目内容

    image.png

  • 题目示例

    ASe034SgyF.png

  • 题目解析

    • rows == mat.length
    • cols == mat[i].length
    • 1 <= rows, cols <= 100
    • mat[i][j] 是 0 或 1

二、思路分析:

我们拿到本题,读取题目内容要求在二进制的矩阵中找出符合特殊位置的次数,那么特殊位置是需要符合什么条件的,继续审题:

  • 特殊位置:mat[i][j]为1且所处的i行和j列的所有元素都为0
  • image.png
  • 二维矩阵中的所有的元素只有0和1两种情况
  • 二维矩阵的行和列的起始点都是从下标为0开始

根据以上内容,解答本题我们可以直接使用模拟方法进行求解,思路如下:

  • 方法:模拟实现

  • 首先对二维矩阵mat每行和每列进行遍历,找到元素为1的元素,并记录出现的次数
  • 使用两个for循环遍历mat矩阵的元素,并分别定义row和col两个临时数组存储每行每列的1元素次数
  • 再使用两个for循环,第一层for循环遍历row数组的元素r,第二个for循环遍历col数组元素c
  • 当mat[i][j]元素为1并且r=1,c=1时,ans结果进行+1,直到遍历完row数组
  • 根据以上思路,我们使用python可以快速实现,代码如下:
    class Solution(object):
        def numSpecial(self, mat):
            """
            :type mat: List[List[int]]
            :rtype: int
            """
            ans = 0
            row = [0]*len(mat)
            col = [0]*len(mat[0])
    
            for i,ma in enumerate(mat):
                for j,mm in enumerate(ma):
                    if mm == 1:
                        row[i] +=1
                        col[j] +=1
            for i,r in enumerate(row):
                for j,c in enumerate(col):
                    if mat[i][j]==1 and r == 1 and c ==1:
                        ans +=1        
            return ans
    
  • 写法优化一:

    • 上述关于求出每行和每列的元素1出现的次数,我们是定义两个临时数组并使用两个for循环遍历mat求解
    • 关于python数组中,我们可以直接在数组中写表达式,代码实现只需一行
    • 关于求每列的元素1,需要借助zip(*mat)函数
      row = [sum(ro) for ro in mat]
      col = [sum(co) for co in zip(*mat)]
      

三、总结:

本题考察对二维数组行和列的元素进行遍历记录,可以使用两个for循环也可以借助zip求出每列的元素次数,AC 提🦶记录如下: image.png

  • 时间复杂度:O(n*m),n 为 mat矩阵的行,m为mat矩阵的列
  • 空间复杂度:O(n+m),需要使用两个临时数组来记录行和列的数据

以上是本期内容,欢迎大佬们点赞评论,下期见~~~