leetcode73. 矩阵置零

本文介绍了一种高效的算法,用于在矩阵中找到所有包含0元素的行和列,并将这些行和列的所有元素置零。通过两次遍历矩阵,首先记录含有0元素的行和列,然后将这些行列置零,实现矩阵的高效处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在这里插入图片描述

思路

根据题意,要使0元素所在的行和列都为0,那么可以先遍历矩阵,用一个辅助列表h1记录下每一行循环时,0元素出现的列数,如果h1为空,说明该行不存在0元素,反之存在,那么可以将该行全部置0;在每一行循环后,将h1放到另一个辅助列表h中,最后去重,对h中的列置0

代码

class Solution:
    def setZeroes(self, matrix: List[List[int]]) -> None:
        """
        Do not return anything, modify matrix in-place instead.
        """
        row = len(matrix)
        col = len(matrix[0])
        h = []
        for i in range(row):
            h1 = []     #每次循环都置为空
            for j in range(col):
                if matrix[i][j] == 0:
                    h1.append(j)
            if h1:    #h1不为空,说明该行存在0元素,该行置0
                matrix[i] = [0] * col
            h.extend(h1)    #不能用append,否则去重时会报错
        h = list(set(h))    #去重
        for m in h:
            for n in range(row):
                matrix[n][m] = 0

也可以遍历两次matrix,第一遍用集合记录哪些行,哪些列有0;第二遍置0

class Solution:
    def setZeroes(self, matrix: List[List[int]]) -> None:
        """
        Do not return anything, modify matrix in-place instead.
        """
        row = len(matrix)
        col = len(matrix[0])
        row_zero = set()
        col_zero = set()
        for i in range(row):
            for j in range(col):
                if matrix[i][j] == 0:
                    row_zero.add(i)
                    col_zero.add(j)
        for i in range(row):
            for j in range(col):
                if i in row_zero or j in col_zero:
                    matrix[i][j] = 0

250217-思路-使用常数空间
关键思想: 用matrix第一行和第一列记录该行该列是否有0,作为标志位

但是对于第一行,和第一列要设置一个标志位,为了防止自己这一行(一列)也有0的情况.注释写在代码里,直接看代码很好理解!

class Solution:
    def setZeroes(self, matrix: List[List[int]]) -> None:
        """
        Do not return anything, modify matrix in-place instead.
        """
        row  = len(matrix)
        col = len(matrix[0])
        # 找寻第一行是有0
        first_row_flag  = 0
        for j in range(col):
            if matrix[0][j] == 0:
                first_row_flag = 1
                break
        # 找第一列是否有0
        first_col_flag =  0
        for i in range(row):
            if matrix[i][0]  == 0:
                first_col_flag = 1
                break
        # 以第一行第一列为标志位,记录每行每列是否含0
        for i in range(1, row):
            for j in range(1, col):
                if matrix[i][j] == 0:
                    matrix[i][0] = 0
                    matrix[0][j] = 0

        # 置0
        for i in range(1, row):
            for j in range(1, col):
                if matrix[i][0] == 0 or matrix[0][j] == 0:
                    matrix[i][j] = 0

        if first_col_flag:
            for i in range(row):
                matrix[i][0] = 0
        if first_row_flag:
            for j in range(col):
                matrix[0][j] = 0
                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值