leetcode 73. 矩阵置零

  1. 题目链接 https://leetcode-cn.com/problems/set-matrix-zeroes/submissions/

  2. 题目描述

    1. 给定一个 m x n 的矩阵,如果一个元素为 0,则将其所在行和列的所有元素都设为 0。请使用原地算法
    2. 输入: 
      [
        [1,1,1],
        [1,0,1],
        [1,1,1]
      ]
      输出: 
      [
        [1,0,1],
        [0,0,0],
        [1,0,1]
      ]
      

      示例 2:

      输入: 
      [
        [0,1,2,0],
        [3,4,5,2],
        [1,3,1,5]
      ]
      输出: 
      [
        [0,0,0,0],
        [0,4,5,0],
        [0,3,1,0]
      ]
  3. 解题思路

    1. O(M + N)空间复杂度的解法: 建立两个数组,size分别等于行,和列。用于记录所在行或列是否有0存在。通过这两个数组将matrix置零,只有只要所在行或列有一个为0的就将该位置置0
    2. O(1)空间复杂度的解法: 找到一个全部非0的行,作为上述解法中标记列的数组.这样只需要一个存储全非0行数组下标的变量
  4. 代码

    1. python o(m + n)
      class Solution:
          def setZeroes(self, matrix):
              """
              Do not return anything, modify matrix in-place instead.
              """
              N, M = len(matrix), len(matrix[0])
              C, R = [1] * N, [1] * M
              for i in range(N):
                  for j in range(M):
                      C[i] &= (matrix[i][j] != 0)
                      R[j] &= (matrix[i][j] != 0)
              for i in range(N):
                  for j in range(M):
                      matrix[i][j] = C[i] & R[j] and matrix[i][j]

       

    2. python o(1)
      class Solution:
          def setZeroes(self, matrix):
              """
              Do not return anything, modify matrix in-place instead.
              """
              all_no_0 = -1
              n, m = len(matrix), len(matrix[0])
              for i in range(n):  # 找到一个全非0行 和一个有0行
                  if all_no_0 == -1:
                      for j in range(m):
                          if matrix[i][j] == 0:
                              break
                      else:
                          all_no_0 = i
      
      
              if all_no_0 == -1:  # 都是没有全非0行 那么matrix 全部为1
                  for i in range(n):
                      for j in range(m):
                          matrix[i][j] = 0
      
              else:
      
                  for i in range(m):  # 标记列
                      for j in range(n):
                          if matrix[j][i] == 0:
                              matrix[all_no_0][i] = 0
                              break
      
      
                  for i in range(n): # 行置0
                      if i != all_no_0:
                          for j in range(m):
                              if matrix[i][j] == 0:
                                  for j in range(m):
                                      matrix[i][j] = 0
                                  break
      
                  for i in range(m): # 列置0
                      if matrix[all_no_0][i] == 0:
                          for j in range(n):
                                  matrix[j][i] = 0
      

       

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值