diff --git a/矩阵/1. 矩阵置零.md b/矩阵/1. 矩阵置零.md new file mode 100644 index 0000000..cfab182 --- /dev/null +++ b/矩阵/1. 矩阵置零.md @@ -0,0 +1,81 @@ +# 矩阵置零 + +## 题目 + + +给定一个 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]] +示例 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 +-231 <= matrix[i][j] <= 231 - 1 + + +进阶: + +一个直观的解决方案是使用 O(mn) 的额外空间,但这并不是一个好的解决方案。 +一个简单的改进方案是使用 O(m + n) 的额外空间,但这仍然不是最好的解决方案。 +你能想出一个仅使用常量空间的解决方案吗? + +## 思路 + +- 存储 + - `ArrayList()` 存储行和列 +- 更新 + - 更新数组 + + +## 代码 + +```java +class Solution { + public void setZeroes(int[][] matrix) { + // Init: ArrayList + Set wide = new HashSet<>(); // n + Set height = new HashSet<>(); // m + int m = matrix.length; + int n = matrix[0].length; + + // Traverse 1: Mark + for (int i = 0; i < m; i++) { + for (int j = 0; j < n; j++) { + if (matrix[i][j] == 0) { + wide.add(j); + height.add(i); + } + } + } + // Traverse 2: Change + for (int i : height) { + for (int j = 0; j < n; j++) { + matrix[i][j] = 0; + } + } + + for (int j : wide) { + for (int i = 0; i < m; i++) { + matrix[i][j] = 0; + } + } + + + } +} +``` +