Matrix Zeroes
来自 <https://leetcode.com/problems/set-matrix-zeroes/>
Given a m x n matrix, if an element is 0, set its entire row and column to 0. Do it in place.
Follow up:
Did you use extra space?
A straight forward solution using O(mn) space is probably a bad idea.
A simple improvement uses O(m + n) space, but still not the best solution.
Could you devise a constant space solution?
题目解读
给定一个矩阵,如果矩阵中的某个元素为0,则将其所在的整行和整列全部设置为0,在原来的矩阵中设置。
题目解析:
解法一:使用 O(mn)额外空间,创建一个和原来矩阵大小相同的矩阵matrixTemp,根据原来矩阵matrix的元素值设置matrix矩阵中行和列为。最后再将matrixTemp中的元素复制给matrix.
解法二:创建两个数组zeroRows和zeroCols,zeroRows记录那些行应该置为0,zeroCols记录那些列应该置为0.先遍历一遍矩阵,给数组zeroRows和zeroCols中的元素赋值。最后根据数组zeroRows和zeroCols中的元素,将矩阵中的某些行和列设置为0。
解法三:利用第0行和第0列记录将要置零的行和列,分如下四步
Analysis
This problem should be solved in place, i.e., no other array should be used. We can use the first column and the first row to track if a row/column should be set to 0.
Since we used the first row and first column to mark the zero row/column, the original values are changed.
Specifically, given, the following matrix
this problem can be solved by following 4 steps:
Step 1:
First row contains zero = true;
First column contains zero = false;
Step 2: use first row and column to mark zero row and column.
Step 3: set each elements by using marks in first row and column.
Step 4: Set first column and row by using marks in step 1.
来自 <http://www.programcreek.com/2012/12/leetcode-set-matrix-zeroes-java/>
解法一代码:
public class Solution {
public void setZeroes(int[][] matrix) {
int[][] matrixTemp = new int[matrix.length][matrix[0].length];
//将matrix中的元素全部复制给tempMatrix
for(int i=0; i<matrix.length; i++) {
for(int j=0; j<matrix[0].length; j++) {
matrixTemp[i][j] = matrix[i][j];
}
}
for(int i=0; i<matrix.length; i++) {
for(int j=0; j<matrix[0].length; j++) {
if(0 == matrix[i][j]){
//将j列元素置零
for(int m=0; m<matrix.length; m++) {
matrixTemp[m][j] = 0;
}
//将i行元素置零
for(int n=0; n<matrix[0].length; n++) {
matrixTemp[i][n] = 0;
}
}
}
}
for(int i=0; i<matrix.length; i++) {
for(int j=0; j<matrix[0].length; j++) {
matrix[i][j] = matrixTemp[i][j];
}
}
}
}
解法一性能:
解法二代码:
public class Solution {
public void setZeroes(int[][] matrix) {
//用于记录那些行应该设置为0
int[] zeroRows = new int[matrix.length];
for(int i=0; i<matrix.length; i++) {
zeroRows[i] = 1;
}
//记录那些列应该设置为0
int[] zeroCols = new int[matrix[0].length];
for(int i=0; i<matrix[0].length; i++) {
zeroCols[i] = 1;
}
for(int i=0; i< matrix.length; i++) {
for(int j=0; j<matrix[0].length; j++) {
if(0 == matrix[i][j]){
zeroRows[i] = 0;
zeroCols[j] = 0;
}
}
}
//将行置为0
for(int i=0; i<matrix.length; i++) {
if(0 == zeroRows[i]) {
for(int j=0; j<matrix[0].length; j++) {
matrix[i][j] = 0;
}
}
}
//将列置为0
for(int i=0; i<matrix[0].length; i++) {
if(0 == zeroCols[i]) {
for(int j=0; j<matrix.length; j++) {
matrix[j][i]=0;
}
}
}
}
}
解法二性能:
解法三代码
public class Solution {
public void setZeroes(int[][] matrix) {
/**
* 记录第一行第一列是否为零
*/
boolean firstRowZero = false;
boolean firstColZero = false;
/**
* 判断第一列是否为0
*/
for(int i=0; i<matrix.length; i++) {
if(0 == matrix[i][0]) {
firstColZero = true;
}
}
/**
* 判断第一行是否为0
*/
for(int i=0; i<matrix[0].length; i++) {
if(0 == matrix[0][i])
firstRowZero = true;
}
/**
* 遍历整个矩阵,将要置为0的行和列标注在第0行和第0列
*/
for(int i=0; i<matrix.length; i++) {
for(int j=0; j<matrix[0].length; j++) {
if(0 == matrix[i][j]){
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(firstRowZero) {
for(int i=0; i<matrix[0].length; i++)
matrix[0][i] = 0;
}
/**
* 第一列是否置零
*/
if(firstColZero) {
for(int i=0; i<matrix.length; i++)
matrix[i][0] = 0;
}
}
}
解法三性能: