package leetcode.editor.cn;
//给定一个 m x n 的矩阵,如果一个元素为 0,则将其所在行和列的所有元素都设为 0。请使用原地算法。
//
// 示例 1:
//
// 输入:
//[
// [1,1,1],
// [1,0,1],
// [1,1,1]
//]
//输出:
//[
// [1,0,1],
// [0,0,0],
// [1,0,1]
//]
//
//
// 示例 2:
//
// 输入:
//[
// [0,1,2,0],
// [3,4,5,2],
// [1,3,1,5]
//]
//输出:
//[
// [0,0,0,0],
// [0,4,5,0],
// [0,3,1,0]
//]
//
// 进阶:
//
//
// 一个直接的解决方案是使用 O(mn) 的额外空间,但这并不是一个好的解决方案。
// 一个简单的改进方案是使用 O(m + n) 的额外空间,但这仍然不是最好的解决方案。
// 你能想出一个常数空间的解决方案吗?
//
// Related Topics 数组
import javax.print.attribute.HashAttributeSet;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Hashtable;
import java.util.List;
//Java:矩阵置零
public class P73矩阵置零{
public static void main(String[] args) {
Solution solution = new P73矩阵置零().new Solution();
int[][] a = {{0, 1, 0}, {1, 1, 1}, {1, 1, 1}};
solution.setZeroes(a);
// TO TEST
}
//leetcode submit region begin(Prohibit modification and deletion)
// 思路:记录0点的行和列,然后分别置零
class Solution {
public void setZeroes(int[][] matrix) {
int row = matrix.length;
int col = matrix[0].length;
int[] rowZero = new int[col];
HashSet<Integer> a1 = new HashSet<>();
HashSet<Integer> a2 = new HashSet<>();
for (int i = 0; i < row; i++) {
for (int j = 0; j < col; j++) {
if (matrix[i][j] == 0) {
a1.add(i);
a2.add(j);
}
}
}
for (Integer node : a1) {
matrix[node] = rowZero;
}
for (Integer node : a2) {
for (int j = 0; j < row; j++) {
matrix[j][node] = 0;
}
}
}
}
//leetcode submit region end(Prohibit modification and deletion)
}