【Leetcode】Set Matrix Zeroes

本文介绍了一种高效的矩阵置零算法,该算法可在原地修改矩阵,将包含0元素的行和列全部置零。通过使用第一行和第一列作为标记,避免了额外的空间开销,并详细介绍了Java、Python及C++三种语言的实现方式。

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

题目:

Given a m x n matrix, if an element is 0, set its entire row and column to 0. Do it in place.


分析:

这题的关键点在于用第一行和第一列来标志哪些行哪些列有0。首选第一次遍历矩阵,把0元素所在行列的第一行和第一列标志为0,暗指这一行和这一列必须为0,第一次遍历完矩阵后,再进行第二次遍历,将第一行和第一列上标识了0元素的行列进行置0操作,为了对一些第一行和第一列自带的0元素与置0操作后标志为0的元素进行区别,这里还用到了fr和fc两个变量,含义是first row 和first column,主要用于判断第一行和第一列是否一开始就含有0元素,有的话设置为true,(注意在第二次遍历的时候,要从第二行和第二列开始,因为最后会对第一列和第一行进行最终的判断操作。)两次遍历完后,最后再对第一行和第一列进行置0的操作。


Java版本:

class Solution {
    public void setZeroes(int[][] matrix) {
        boolean fr = false,fc = false;
        for(int i = 0; i < matrix.length; i++) {
            for(int j = 0; j < matrix[0].length; j++) {
                if(matrix[i][j] == 0) {
                    if(i == 0) fr = true;
                    if(j == 0) fc = true;
                    matrix[0][j] = 0;
                    matrix[i][0] = 0;
                }
            }
        }
        for(int i = 1; i < matrix.length; i++) {
            for(int j = 1; j < matrix[0].length; j++) {
                if(matrix[i][0] == 0 || matrix[0][j] == 0) {
                    matrix[i][j] = 0;
                }
            }
        }
        if(fr) {
            for(int j = 0; j < matrix[0].length; j++) {
                matrix[0][j] = 0;
            }
        }
        if(fc) {
            for(int i = 0; i < matrix.length; i++) {
                matrix[i][0] = 0;
            }
        }
    }
}

Python版本:

class Solution:
# @param {integer[][]} matrix
# @return {void} Do not return anything, modify matrix in-place instead.
def setZeroes(self, matrix):
    m = len(matrix)
    if m == 0:
        return
    n = len(matrix[0])
    
    row_zero = False
    for i in range(m):
        if matrix[i][0] == 0:
            row_zero = True
    col_zero = False
    for j in range(n):
        if matrix[0][j] == 0:
            col_zero = True
            
    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):
        if matrix[i][0] == 0:
            for j in range(1, n):
                matrix[i][j] = 0
                
    for j in range(1, n):
        if matrix[0][j] == 0:
            for i in range(1, m):
                matrix[i][j] = 0
    
    if col_zero:
        for j in range(n):
            matrix[0][j] = 0
    if row_zero:
        for i in range(m):
            matrix[i][0] = 0


C++版本:

void setZeroes(vector<vector<int> > &matrix) {
    int col0 = 1, rows = matrix.size(), cols = matrix[0].size();

    for (int i = 0; i < rows; i++) {
        if (matrix[i][0] == 0) col0 = 0;
        for (int j = 1; j < cols; j++)
            if (matrix[i][j] == 0)
                matrix[i][0] = matrix[0][j] = 0;
    }

    for (int i = rows - 1; i >= 0; i--) {
        for (int j = cols - 1; j >= 1; j--)
            if (matrix[i][0] == 0 || matrix[0][j] == 0)
                matrix[i][j] = 0;
        if (col0 == 0) matrix[i][0] = 0;
    }
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值