73. 矩阵置零(Set Matrix Zeroes)

题解

很自然想到借助额外空间保存0的位置,然后对原矩阵进行置0

额外空间

  1. 定义两个元组 r e s _ i , r e s _ j res\_i,res\_j res_i,res_j,保存矩阵中 0 0 0的行和列索引。
  2. 初始化矩阵行数 m m m和列数 n n n
  3. 遍历矩阵,若 m a t r i x [ i ] [ j ] = = 0 matrix[i][j]==0 matrix[i][j]==0,将对应的行和列索引加入 r e s _ i , r e s _ j res\_i,res\_j res_i,res_j
  4. 再遍历一次矩阵,若当前位置的行或列索引在行元组或列元组中出现,即 i   i n   r e s _ i   o r   j   i n   r e s _ j i\ in\ res\_i\ or\ j\ in\ res\_j i in res_i or j in res_j,将此位置置为 0 0 0

复杂度分析

  • 时间复杂度: O ( M ∗ N ) O(M*N) O(MN)
  • 空间复杂度: O ( M + N ) O(M+N) O(M+N)

Python

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

Java(待完成)

O ( 1 ) O(1) O(1)空间

我们利用矩阵的第一行和第一列保存该行或者列是否应被置为0

算法流程

  1. 定义 f l a g _ l i n e = F a l s e flag\_line=False flag_line=False,判断第一行是否需要置 0 0 0。定义 f l a g _ r o w = F a l s e flag\_row=False flag_row=False,判断第一列是否需要置 0 0 0
  2. 遍历第一列,若第一列中存在 0 0 0,将 f l a g _ r o w = T r u e flag\_row=True flag_row=True,表示需要将第一列置 0 0 0
  3. 遍历第一行,若第一行中存在 0 0 0,将 f l a g _ l i n e = T r u e flag\_line=True flag_line=True,表示需要将第一行置 0 0 0
  4. 遍历矩阵,遍历区间,行区间 [ 1 , m ) [1,m) [1,m),列区间 [ 1 , m ) [1,m) [1,m),若 m a t r i x [ i ] [ j ] = = 0 matrix[i][j]==0 matrix[i][j]==0,则将对应的行和列记录下来,即将第一行和第一列中对应的位置置为 0 0 0 m a t r i x [ i ] [ 0 ] = m a t r i x [ 0 ] [ j ] = 0 matrix[i][0]=matrix[0][j]=0 matrix[i][0]=matrix[0][j]=0
  5. 再遍历一次矩阵,若当前位置的行或列索引对应的第一行或者第一列处为 0 0 0,即 m a t r i x [ i ] [ 0 ] = = 0   o r   m a t r i x [ 0 ] [ j ] = = 0 matrix[i][0]==0\ or\ matrix[0][j]==0 matrix[i][0]==0 or matrix[0][j]==0,将此位置置为 0 0 0
  6. 根据 f l a g _ l i n e flag\_line flag_line,判断是否需要将第一行置为 0 0 0
  7. 根据 f l a g _ r o w flag\_row flag_row,判断第一列是否需要置 0 0 0

复杂度分析

  • 时间复杂度: O ( M ∗ N ) O(M*N) O(MN)
  • 空间复杂度: O ( 1 ) O(1) O(1)

Python

class Solution:
    def setZeroes(self, matrix: List[List[int]]) -> None:
        """
        Do not return anything, modify matrix in-place instead.
        """
        flag_line=False
        flag_row=False
        m=len(matrix)
        n=len(matrix[0])
        for i in range(m):
            if(matrix[i][0]==0):
                flag_row=True
                break
        for i in range(n):
            if(matrix[0][i]==0):
                flag_line=True
                break
        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):
                    matrix[i][j]=0                    
        if(flag_row):
            for i in range(m):
                matrix[i][0]=0
        if(flag_line):
            for i in range(n):
                matrix[0][i]=0

Java(待完成)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值