矩阵置零

矩阵置零

CategoryDifficultyLikesDislikes
algorithmsMedium (63.20%)888-
Tags

array

Companies

amazon | microsoft

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

示例 1:

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

示例 2:

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
  • -2<sup>31</sup> <= matrix[i][j] <= 2<sup>31</sup> - 1

进阶:

  • 一个直观的解决方案是使用 O(<em>m</em><em>n</em>) 的额外空间,但这并不是一个好的解决方案。
  • 一个简单的改进方案是使用 O(<em>m</em> + <em>n</em>) 的额外空间,但这仍然不是最好的解决方案。
  • 你能想出一个仅使用常量空间的解决方案吗?

Discussion | Solution

解法

 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
40
41
42
43
44
45
46
47
// @lc code=start
impl Solution {
    /// ## 解题思路
    /// 1. 第一次遍历所有元素,标记所有0元素对应的第0行,第0列元素;
    /// 2. 分别遍历第0行,第0列,将其中标记元素对应的列,行所有元素置为0;
    /// 3. 如果第0行,第0列中有0, 则将第0行,第0列也都全部置为0;
    pub fn set_zeroes(matrix: &mut Vec<Vec<i32>>) {
        let (m, n) = (matrix.len(), matrix[0].len());
        let (mut col_0, mut row_0) = (false, false);
        for i in 0..m {
            for j in 0..n {
                if matrix[i][j] == 0 {
                    if i == 0 {
                        col_0 = true;
                    }
                    if j == 0 {
                        row_0 = true;
                    }
                    matrix[i][0] = 0;
                    matrix[0][j] = 0;
                }
            }
        }

        (1..m).for_each(|i| {
            if matrix[i][0] == 0 {
                (1..n).for_each(|j| matrix[i][j] = 0);
            }
        });

        (1..n).for_each(|j| {
            if matrix[0][j] == 0 {
                (1..m).for_each(|i| matrix[i][j] = 0);
            }
        });

        if col_0 {
            (0..n).for_each(|j| matrix[0][j] = 0);
        }
        if row_0 {
            (0..m).for_each(|i| matrix[i][0] = 0);
        }
    }
}
// @lc code=end

struct Solution;
updatedupdated2024-08-252024-08-25