Python矩阵置零算法全解析

Python 矩阵置零问题解析

矩阵置零问题要求将矩阵中某个元素为零的行和列全部置零。这是一个经典的算法问题,常用于考察对矩阵操作的理解和实现能力。

问题描述

给定一个 m x n 的矩阵,如果一个元素为 0,则将其所在行和列的所有元素都设为 0。要求原地修改矩阵,即不使用额外的存储空间。

方法一:使用标记数组

通过两个标记数组分别记录需要置零的行和列。遍历矩阵,记录所有零元素的行和列。再次遍历矩阵,根据标记数组将对应行和列置零。

def setZeroes(matrix):
    m, n = len(matrix), len(matrix[0])
    rows, cols = [False] * m, [False] * n
    
    for i in range(m):
        for j in range(n):
            if matrix[i][j] == 0:
                rows[i] = True
                cols[j] = True
    
    for i in range(m):
        for j in range(n):
            if rows[i] or cols[j]:
                matrix[i][j] = 0

方法二:原地标记

利用矩阵的第一行和第一列作为标记空间。首先检查第一行和第一列是否需要置零。遍历矩阵其余部分,将零元素的位置记录在第一行和第一列。根据标记置零。

def setZeroes(matrix):
    m, n = len(matrix), len(matrix[0])
    first_row_zero = any(matrix[0][j] == 0 for j in range(n))
    first_col_zero = 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] = 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 first_row_zero:
        for j in range(n):
            matrix[0][j] = 0
    if first_col_zero:
        for i in range(m):
            matrix[i][0] = 0

方法三:优化空间复杂度

进一步优化空间复杂度,仅使用一个变量标记第一列是否需要置零。其余步骤与方法二类似。

def setZeroes(matrix):
    m, n = len(matrix), len(matrix[0])
    first_col_zero = False
    
    for i in range(m):
        if matrix[i][0] == 0:
            first_col_zero = True
        for j in range(1, n):
            if matrix[i][j] == 0:
                matrix[i][0] = 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 matrix[0][0] == 0:
        for j in range(n):
            matrix[0][j] = 0
    
    if first_col_zero:
        for i in range(m):
            matrix[i][0] = 0

方法四:位运算优化

使用位运算记录需要置零的行和列。适用于矩阵规模较小的情况,但实际应用中较少使用。

def setZeroes(matrix):
    m, n = len(matrix), len(matrix[0])
    row_mask, col_mask = 0, 0
    
    for i in range(m):
        for j in range(n):
            if matrix[i][j] == 0:
                row_mask |= 1 << i
                col_mask |= 1 << j
    
    for i in range(m):
        for j in range(n):
            if (row_mask & (1 << i)) or (col_mask & (1 << j)):
                matrix[i][j] = 0

总结

矩阵置零问题可以通过多种方法解决,每种方法在时间复杂度和空间复杂度上各有优劣。实际应用中,方法二和方法三因其原地修改的特性更为常用。理解这些方法的差异有助于在实际问题中选择合适的解决方案。

BbS.okane224.info/PoSt/1121_764771.HtM
BbS.okane225.info/PoSt/1121_888152.HtM
BbS.okane226.info/PoSt/1121_298499.HtM
BbS.okane227.info/PoSt/1121_088094.HtM
BbS.okane228.info/PoSt/1121_784506.HtM
BbS.okane229.info/PoSt/1121_951019.HtM
BbS.okane230.info/PoSt/1121_717223.HtM
BbS.okane231.info/PoSt/1121_272517.HtM
BbS.okane232.info/PoSt/1121_737518.HtM
BbS.okane233.info/PoSt/1121_016556.HtM
BbS.okane224.info/PoSt/1121_209698.HtM
BbS.okane225.info/PoSt/1121_699428.HtM
BbS.okane226.info/PoSt/1121_054000.HtM
BbS.okane227.info/PoSt/1121_658035.HtM
BbS.okane228.info/PoSt/1121_245427.HtM
BbS.okane229.info/PoSt/1121_312110.HtM
BbS.okane230.info/PoSt/1121_475032.HtM
BbS.okane231.info/PoSt/1121_763879.HtM
BbS.okane232.info/PoSt/1121_897431.HtM
BbS.okane233.info/PoSt/1121_260372.HtM
BbS.okane234.info/PoSt/1121_883834.HtM
BbS.okane235.info/PoSt/1121_088388.HtM
BbS.okane236.info/PoSt/1121_841451.HtM
BbS.okane237.info/PoSt/1121_543228.HtM
BbS.okane238.info/PoSt/1121_633399.HtM
BbS.okane239.info/PoSt/1121_999483.HtM
BbS.okane240.info/PoSt/1121_386075.HtM
BbS.okane241.info/PoSt/1121_445772.HtM
BbS.okane242.info/PoSt/1121_413719.HtM
BbS.okane243.info/PoSt/1121_251656.HtM
BbS.okane234.info/PoSt/1121_939880.HtM
BbS.okane235.info/PoSt/1121_760998.HtM
BbS.okane236.info/PoSt/1121_738501.HtM
BbS.okane237.info/PoSt/1121_563544.HtM
BbS.okane238.info/PoSt/1121_630790.HtM
BbS.okane239.info/PoSt/1121_009471.HtM
BbS.okane240.info/PoSt/1121_129376.HtM
BbS.okane241.info/PoSt/1121_877671.HtM
BbS.okane242.info/PoSt/1121_137748.HtM
BbS.okane243.info/PoSt/1121_511330.HtM
BbS.okane234.info/PoSt/1121_802145.HtM
BbS.okane235.info/PoSt/1121_690920.HtM
BbS.okane236.info/PoSt/1121_696861.HtM
BbS.okane237.info/PoSt/1121_972760.HtM
BbS.okane238.info/PoSt/1121_191469.HtM
BbS.okane239.info/PoSt/1121_790466.HtM
BbS.okane240.info/PoSt/1121_833055.HtM
BbS.okane241.info/PoSt/1121_657881.HtM
BbS.okane242.info/PoSt/1121_035920.HtM
BbS.okane243.info/PoSt/1121_095507.HtM
BbS.okane234.info/PoSt/1121_778281.HtM
BbS.okane235.info/PoSt/1121_559379.HtM
BbS.okane236.info/PoSt/1121_628900.HtM
BbS.okane237.info/PoSt/1121_031335.HtM
BbS.okane238.info/PoSt/1121_949525.HtM
BbS.okane239.info/PoSt/1121_097288.HtM
BbS.okane240.info/PoSt/1121_758038.HtM
BbS.okane241.info/PoSt/1121_645830.HtM
BbS.okane242.info/PoSt/1121_825499.HtM
BbS.okane243.info/PoSt/1121_013672.HtM
BbS.okane234.info/PoSt/1121_296872.HtM
BbS.okane235.info/PoSt/1121_489000.HtM
BbS.okane236.info/PoSt/1121_218725.HtM
BbS.okane237.info/PoSt/1121_142256.HtM
BbS.okane238.info/PoSt/1121_725475.HtM
BbS.okane239.info/PoSt/1121_760058.HtM
BbS.okane240.info/PoSt/1121_485007.HtM
BbS.okane241.info/PoSt/1121_110614.HtM
BbS.okane242.info/PoSt/1121_589364.HtM
BbS.okane243.info/PoSt/1121_113848.HtM
BbS.okane234.info/PoSt/1121_640195.HtM
BbS.okane235.info/PoSt/1121_191384.HtM
BbS.okane236.info/PoSt/1121_233810.HtM
BbS.okane237.info/PoSt/1121_934663.HtM
BbS.okane238.info/PoSt/1121_416134.HtM
BbS.okane239.info/PoSt/1121_224269.HtM
BbS.okane240.info/PoSt/1121_757312.HtM
BbS.okane241.info/PoSt/1121_610017.HtM
BbS.okane242.info/PoSt/1121_770644.HtM
BbS.okane243.info/PoSt/1121_424186.HtM

#牛客AI配图神器#

全部评论

相关推荐

青春运维少年不会梦到...:实习大王
点赞 评论 收藏
分享
小浪_Coding:1. 项目,纯测试的项目不要往简历上写, 外卖项目需要包装一下,加点自己的产出,和测试关联的 2. 个人技能写的浅且不全, 需要展开细写, 同时需要补充额外的技术栈. 3. 项目可以换i自动化/CI CD的项目, 整体排版需要优化.
点赞 评论 收藏
分享
🎓学历背景:双非土木硕👨‍💻意向职位:AI应用开发大佬们可以帮我看看简历吗,秋招至今0offer
秋招结束再玩瓦:今年科班都不好找哇……你可以试试交叉岗,比如制造业国企的一些开发算法,或者互联网的边缘岗,it技术支持,运维这些
我的简历长这样
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务