leetcode
leetcode 2801 ~ 2850
零矩阵

零矩阵

难度:

标签:

题目描述

Write an algorithm such that if an element in an MxN matrix is 0, its entire row and column are set to 0.

 

Example 1:

Input: 
[
  [1,1,1],
  [1,0,1],
  [1,1,1]
]
Output: 
[
  [1,0,1],
  [0,0,0],
  [1,0,1]
]

Example 2:

Input: 
[
  [0,1,2,0],
  [3,4,5,2],
  [1,3,1,5]
]
Output: 
[
  [0,0,0,0],
  [0,4,5,0],
  [0,3,1,0]
]

代码结果

运行时间: 23 ms, 内存: 16.9 MB


/*
 * 题目思路:
 * 1. 使用stream API实现标记零元素的行和列。
 * 2. 然后使用stream API将对应行和列清零。
 */
import java.util.stream.IntStream;
import java.util.stream.Stream;

public class SolutionStream {
    public void setZeroes(int[][] matrix) {
        int rows = matrix.length;
        int cols = matrix[0].length;
        boolean[] rowZero = new boolean[rows];
        boolean[] colZero = new boolean[cols];

        // 标记哪些行和列需要清零
        IntStream.range(0, rows).forEach(i -> {
            IntStream.range(0, cols).forEach(j -> {
                if (matrix[i][j] == 0) {
                    rowZero[i] = true;
                    colZero[j] = true;
                }
            });
        });

        // 设置对应行列为0
        IntStream.range(0, rows).forEach(i -> {
            IntStream.range(0, cols).forEach(j -> {
                if (rowZero[i] || colZero[j]) {
                    matrix[i][j] = 0;
                }
            });
        });
    }
}

解释

方法:

此题解的思路是首先遍历整个矩阵,记录下所有值为0的元素的行号和列号。利用两个列表分别存储这些行号和列号。在记录行号和列号后,利用集合去重,然后遍历这些唯一的行号,将对应的每一行的所有元素设置为0。接着,遍历这些唯一的列号,将对应的每一列的所有元素设置为0。这样可以确保所有应该被清零的行和列都被正确处理。

时间复杂度:

O(N*M)

空间复杂度:

O(N + M)

代码细节讲解

🦆
在遍历矩阵时,你是如何决定同时记录行号和列号的?这种方法与只记录行号或只记录列号相比有什么优势?
在遍历矩阵时,同时记录行号和列号是因为一旦矩阵中的某个元素为0,那么不仅整个行需要被置为0,其所在的列也需要被置为0。如果只记录行号或只记录列号,我们将无法完成题目要求的将元素所在行和列都置0的操作。例如,如果我们只记录行号,那么虽然能将所有包含0的行置为0,但无法处理那些因为同一行中不同元素所在的不同列也应该被置为0的情况。因此,同时记录行号和列号可以确保我们有足够的信息来正确修改整个矩阵。
🦆
请问为什么在记录行号和列号后,需要使用集合去除重复值而不是直接操作原始列表?
使用集合去除重复值主要是为了优化接下来将行和列置为0的操作的效率。如果不去除重复值,那么在后续的操作中可能会对同一行或列重复执行置0的操作,这样不仅增加了不必要的计算量,还降低了算法的总体效率。通过使用集合去除重复的行号和列号,我们可以确保每一行和每一列只被置为0一次,从而优化了执行时间和减少了不必要的操作。
🦆
在将行和列设为0的过程中,是否有可能出现对同一行或列重复操作的情况?如果是,这种重复操作有没有办法优化?
如果不使用集合去除行号和列号的重复值,则在将行和列设为0的过程中的确可能出现对同一行或列重复操作的情况。这是因为如果矩阵中多个元素为0且它们位于同一行或列,我们可能会多次记录这一行或列。为了优化,我们使用集合来去除这些重复值,确保每一行和每一列只处理一次,从而避免了重复操作。这样不仅提升了算法的效率,还节省了运行时间。

相关问题