2019.6.2 #程序员笔试必备# LeetCode 从零单刷个人笔记整理(持续更新)
难得的限定空间复杂度的题目。
题目难点在于不能让修改值影响遍历检查,如果检查到0值的时候,直接将本行本列置零,则会影响后续遍历;如果检查到0值的时候,只对该行该列之前位置置零,则会产生大量重复。因此必须要开辟空间对行列的检查情况进行存储。
如何只用常量空间存储行列检查情况呢?可以利用矩阵的首行存储各列情况,用矩阵首列存储各行情况。另外再用首元素存储首行情况,开辟一个变量isCol存储。
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:
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?
给定一个 m x n 的矩阵,如果一个元素为 0,则将其所在行和列的所有元素都设为 0。请使用原地算法。
进阶:
一个直接的解决方案是使用 O(mn) 的额外空间,但这并不是一个好的解决方案。
一个简单的改进方案是使用 O(m + n) 的额外空间,但这仍然不是最好的解决方案。
你能想出一个常数空间的解决方案吗?
示例 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]
]
import java.util.Arrays;
/**
*
* Given a m x n matrix, if an element is 0, set its entire row and column to 0. Do it in-place.
* 给定一个 m x n 的矩阵,如果一个元素为 0,则将其所在行和列的所有元素都设为 0。请使用原地算法。
*
*/
public class SetMatrixZeroes {
//行扫描并记录出现0的列。空间复杂度o(n),时间复杂度o(n^2)
public void setZeroes(int[][] matrix) {
int col = matrix[0].length;
boolean[] zeroCol = new boolean[col];
for(int i = 0; i < matrix.length; i++){
boolean rowflag = false;
for(int j = 0; j < matrix[0].length; j++){
if(matrix[i][j] == 0){
rowflag = true;
zeroCol[j] = true;
}
if(zeroCol[j]){
matrix[i][j] = 0;
continue;
}
}
if(rowflag){
Arrays.fill(matrix[i], 0);
}
}
for(int j = 0; j < col; j++){
if(zeroCol[j]){
for(int i = 0; i < matrix.length; i++){
matrix[i][j] = 0;
}
}
}
}
//利用首行首列作为标识向量:空间复杂度o(1)
public void setZeroes1(int[][] matrix){
//matrix[0][0]代表首行是否存在0,isCol代表首列是否存在0
boolean isCol = false;
int rowLen = matrix.length;
int colLen = matrix[0].length;
for(int i = 0; i < rowLen; i++){
//逐行检查首列
if(matrix[i][0] == 0){
isCol = true;
}
//从第一列开始检查,并用第一行和第一列作为记录
for(int j = 1; j < colLen; j++){
if(matrix[i][j] == 0){
matrix[0][j] = 0;
matrix[i][0] = 0;
}
}
}
//根据第一行和第一列的标志重置矩阵
for(int i = 1; i < rowLen; i ++){
for(int j = 1; j < colLen; j++){
if(matrix[i][0] == 0 || matrix[0][j] == 0){
matrix[i][j] = 0;
}
}
}
//重置首行和首列
if(matrix[0][0] == 0){
Arrays.fill(matrix[0], 0);
}
if(isCol){
for(int i = 0; i < rowLen; i++){
matrix[i][0] = 0;
}
}
}
}
#Coding一小时,Copying一秒钟。留个言点个赞呗,谢谢你#