• Leetcode 73. 矩阵置零


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

    示例 1:
    在这里插入图片描述

    输入:matrix = [[1,1,1],[1,0,1],[1,1,1]]
    输出:[[1,0,1],[0,0,0],[1,0,1]]

    示例 2:
    在这里插入图片描述

    输入:matrix = [[0,1,2,0],[3,4,5,2],[1,3,1,5]]
    输出:[[0,0,0,0],[0,4,5,0],[0,3,1,0]]

    提示:
    m==matrix.length
    n == matrix[0].length
    1 <= m, n <= 200
    -231 <= matrix[i][j] <= 231 - 1

    思路:
    方法一: 用 O(m+n)额外空间
    两遍扫matrix,第一遍用集合记录哪些行,哪些列有0;第二遍置0

    python:

    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])
            row0=set()
            col0=set()
            for i in range(row):
                for j in range(col):
                    if matrix[i][j]==0:
                        row0.add(i)
                        col0.add(j)
    
            for i in range(row):
                for j in range(col):
                    if i in row0 or j in col0:
                        matrix[i][j]=0
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    思路二: 用O(1)空间
    关键思想: 用matrix第一行和第一列记录该行该列是否有0,作为标志位
    但是对于第一行,和第一列要设置一个标志位,为了防止自己这一行(一列)也有0的情况.

    python:

    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])
            row0_flag = False
            col0_flag = False
            # 找第一行是否有0
            for j in range(col):
                if matrix[0][j] == 0:
                    row0_flag = True
                    break
            # 第一列是否有0
            for i in range(row):
                if matrix[i][0] == 0:
                    col0_flag = True
                    break
    
            # 把第一行或者第一列作为 标志位
            for i in range(1, row):
                for j in range(1, col):
                    if matrix[i][j] == 0:
                        matrix[i][0] = matrix[0][j] = 0
            #print(matrix)
            # 置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 row0_flag:
                for j in range(col):
                    matrix[0][j] = 0
            if col0_flag:
                for i in range(row):
                    matrix[i][0] = 0
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
  • 相关阅读:
    ceph分布式存储部署
    【LVGL事件(Events)】事件在不同组件上的应用(一)
    基于微信小程序+Java+Vue+MySQL的菜谱分享小程序
    Linux权限
    Canvas动画
    AI作画使用指南
    优化算法 -AdGrad算法
    .NET Emit 入门教程:第六部分:IL 指令:6:详解 ILGenerator 指令方法:方法调用指令
    【OpenCV实现图像:使用OpenCV进行物体轮廓排序】
    ModStartCMS v7.6.0 CMS备份恢复优化,主题开发文档更新
  • 原文地址:https://blog.csdn.net/ciwei24456/article/details/136585397