矩阵操作之 leecode_73. 矩阵置零

    这次题目记录源自最近在学习的矩阵习题,之前没有概念矩阵可以进行什么操作,做了一两道题后发现,比较喜欢考不占用太多空间的原地操作。如旋转和这次分享的置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

  • 9
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值