这次题目记录源自最近在学习的矩阵习题,之前没有概念矩阵可以进行什么操作,做了一两道题后发现,比较喜欢考不占用太多空间的原地操作。如旋转和这次分享的置0操作
准备知识
原地算法(in-place algorithm)概念:是一种使用小的,固定数量的额外之空间来转换资料的算法。当算法执行时,输入的资料通常会被要输出的部分覆盖掉。
python函数:
any函数 是any函数是一个内置函数,用于判断给定可迭代对象中是否存在至少一个为真的元素。它接受一个可迭代对象作为参数,并返回一个布尔值
all函数 是用于判断给定可迭代对象中是否存在所有为真的情况
numbers = [5, 8, 0, 3]
a=any(num<15 for num in numbers)
print(a) # 输出结果为True
b = all(num>0 for num in numbers)
print(b) # 输出结果为False 0==0
Leecode73. 矩阵置零
官方题解的法二,下面这段描述很晕乎,为啥你说会导致原数组修改呢?
我们可以用矩阵的第一行和第一列代替方法一中的两个标记数组,以达到 O(1)的额外空间。但这样会导致原数组的第一行和第一列被修改,无法记录它们是否原本包含 0。
作者:力扣官方题解
链接:https://leetcode.cn/problems/set-matrix-zeroes/solutions/669901/ju-zhen-zhi-ling-by-leetcode-solution-9ll7/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处
后面看代码才慢慢体会到,将第0行和第0列作为标记,那么我这两个地方是不会进行判断操作,他就像解法1的新申请的row[i] col[j]. 但是毕竟你这两个位置是存在原始数据为0的。那怎么办呢?
所以先记录下,表示存在,也不用关心具体的位置。因为矩阵置0,是整行整列操作,只要存在就一起置0. 第二步,开始处理从第一行第一列存在0的数据并将其对应的[0][j] 和[i][0]列位置置0. --即更新标志位
第三步,重新扫描矩阵,如果[0][j] 和[i][0]列位置==0 则将其对应的[i][j]全部置0
第四步,处理完了内部矩阵为0的情况,最后在处理边界存在0的情况,如果为存在,更新对应行列
class Solution:
def setZeroes(self, matrix: List[List[int]]) -> None:
"""
Do not return anything, modify matrix in-place instead.
"""
m=len(matrix)
n = len(matrix[0])
flag_row0 = any(matrix[0][j] == 0 for j in range(n))
flag_col0 = any(matrix[i][0] == 0 for i in range(m))
#
for i in range(1,m):
for j in range(1,n):
if matrix[i][j]==0:
matrix[i][0]=matrix[0][j]=0
for i in range(1,m):
for j in range(1,n):
if matrix[i][0]==0 or matrix[0][j]==0: #之前是row col这样标记,但是前面使用了matrix[i][0] matrix[0][j]来标记所有这里判断条件更改即更新i行J列
matrix[i][j]=0
if flag_col0:
for i in range(m):
matrix[i][0]=0
if flag_row0:
for j in range(n):
matrix[0][j]=0