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]]

题目分析

开辟两个数组,用于记录哪一行有0,哪一列有0
再枚举每一个元素,检查它的行和列是否曾被记录有0,如果是,则把当前元素修改为0
时间复杂度 O(m * n),空间复杂度 O(m + n)

空间上可以进一步优化,以每一行/列第一个元素来记录这行/列有没有0
但第一行和第一列的第一个元素是同一个,会产生冲突,所以第一行和第一列单独开个变量来记录是否有0
时间复杂度 O(m * n),空间复杂度 O(1)

Java

public void setZeroes1(int[][] matrix) {
    int m = matrix.length;
    int n = matrix[0].length;
    boolean[] zeroX = new boolean[m];
    boolean[] zeroY = new boolean[n];
    for (int i = 0; i < m; i++) {
        for (int j = 0; j < n; j++) {
            if (matrix[i][j] == 0) {
                zeroX[i] = true;
                zeroY[j] = true;
            }
        }
    }
    for (int i = 0; i < m; i++) {
        for (int j = 0; j < n; j++) {
            if (zeroX[i] || zeroY[j]) {
                matrix[i][j] = 0;
            }
        }
    }
}

public void setZeroes2(int[][] matrix) {
    int m = matrix.length;
    int n = matrix[0].length;
    boolean zeroX0 = false, zeroY0 = false;
    for (int i = 0; i < m; i++) {
        for (int j = 0; j < n; j++) {
            if (matrix[i][j] == 0) {
                if (i == 0) {
                    zeroX0 = true;
                }
                if (j == 0) {
                    zeroY0 = true;
                }
                if (i != 0 && j != 0) {
                    matrix[i][0] = 0;
                    matrix[0][j] = 0;
                }
            }
        }
    }

    // 先处理后面的,防止第一行第一列被污染
    for (int i = 1; i < m; i++) {
        for (int j = 1; j < n; j++) {
            if (matrix[i][0] == 0 || matrix[0][j] == 0) {
                matrix[i][j] = 0;
            }
        }
    }
    // 处理第一列
    for (int i = 0; i < m; i++) {
        if (zeroY0) {
            matrix[i][0] = 0;
        }
    }
    // 处理第一行
    for (int j = 0; j < n; j++) {
        if (zeroX0) {
            matrix[0][j] = 0;
        }
    }
}

Kotlin

fun setZeroes1(matrix: Array<IntArray>): Unit {
    val m = matrix.size
    val n = matrix[0].size
    val zeroX = BooleanArray(m)
    val zeroY = BooleanArray(n)
    for (i in 0 until m) {
        for (j in 0 until n) {
            if (matrix[i][j] == 0) {
                zeroX[i] = true
                zeroY[j] = true
            }
        }
    }
    for (i in 0 until m) {
        for (j in 0 until n) {
            if (zeroX[i] || zeroY[j]) {
                matrix[i][j] = 0
            }
        }
    }
}

fun setZeroes2(matrix: Array<IntArray>): Unit {
    val m = matrix.size
    val n = matrix[0].size
    var zeroX0 = false
    var zeroY0 = false
    for (i in 0 until m) {
        for (j in 0 until n) {
            if (matrix[i][j] == 0) {
                if (i == 0) {
                    zeroX0 = true
                }
                if (j == 0) {
                    zeroY0 = true
                }
                if (i > 0 && j > 0) {
                    matrix[i][0] = 0
                    matrix[0][j] = 0
                }
            }
        }
    }
    for (i in 1 until m) {
        for (j in 1 until n) {
            if (matrix[i][0] == 0 || matrix[0][j] == 0) {
                matrix[i][j] = 0
            }
        }
    }
    for (i in 0 until m) {
        if (zeroY0) {
            matrix[i][0] = 0
        }
    }
    for (j in 0 until n) {
        if (zeroX0) {
            matrix[0][j] = 0
        }
    }
}

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

开始在上面输入您的搜索词,然后按回车进行搜索。按ESC取消。

返回顶部