持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第6天,点击查看活动详情
测试岗位也越来卷了,除了基本的功能测试外,还要有编程基础、脚本经验才脱颖而出。
怎么才能提高我们的编程能力呢,刷LeetCode是最佳的途径之一,话不多数,刷题走起~
一、题目描述:
-
题目内容
-
题目示例
-
题目解析
- rows == mat.length
- cols == mat[i].length
- 1 <= rows, cols <= 100
- mat[i][j] 是 0 或 1
二、思路分析:
我们拿到本题,读取题目内容要求在二进制的矩阵中找出符合特殊位置的次数,那么特殊位置是需要符合什么条件的,继续审题:
- 特殊位置:mat[i][j]为1且所处的i行和j列的所有元素都为0
- 二维矩阵中的所有的元素只有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 提🦶记录如下:
- 时间复杂度:O(n*m),n 为 mat矩阵的行,m为mat矩阵的列
- 空间复杂度:O(n+m),需要使用两个临时数组来记录行和列的数据
以上是本期内容,欢迎大佬们点赞评论,下期见~~~