问题描述
Given a m x n matrix, if an element is 0, set its entire row and column to 0. Do it in place.
解决思路
难点在于如何不使用辅助空间。
一个巧妙的想法是,
1. 使用两个标记变量,row0_has_zeros和col0_has_zeros分别表示矩阵中的第一行和第一列中是否包含0元素;
2. 从矩阵的内层元素开始遍历,如果矩阵元素为0,则将相应的第一行和第一列对齐元素置为0;
3. 再从矩阵的内层元素开始遍历,遍历的过程中,检查对应的第一行和第一列元素是否为0,如果为0则将该元素置为0;
4. 最后根据两个标记变量,决定是否需要将第一行和第一列的元素全部都置为0.
时间复杂度为O(n^2),空间复杂度为O(1).
程序
public class Solution { public void setZeroes(int[][] matrix) { if (matrix == null || matrix.length == 0 || matrix[0].length == 0) { return; } boolean row0_has_zeros = false; boolean col0_has_zeros = false; for (int i = 0; i < matrix[0].length; i++) { if (matrix[0][i] == 0) { row0_has_zeros = true; break; } } for (int i = 0; i < matrix.length; i++) { if (matrix[i][0] == 0) { col0_has_zeros = true; break; } } for (int i = 1; i < matrix.length; i++) { for (int j = 1; j < matrix[0].length; j++) { if (matrix[i][j] == 0) { matrix[0][j] = 0; matrix[i][0] = 0; } } } for (int i = 1; i < matrix.length; i++) { for (int j = 1; j < matrix[0].length; j++) { if (matrix[0][j] == 0 || matrix[i][0] == 0) { matrix[i][j] = 0; } } } if (row0_has_zeros) { for (int i = 0; i < matrix[0].length; i++) { matrix[0][i] = 0; } } if (col0_has_zeros) { for (int i = 0; i < matrix.length; i++) { matrix[i][0] = 0; } } } }