算法断了一段时间,但是发现还是自己的短板,决定再刷起来,一防止老年痴呆,二锻炼思维,三学习算法。这两天刷了几道二维数组的题目,先总结下。
题目一 73. 矩阵置零
思路
这个题目要求是原地修改,所以对空间有一定要求,这个题的问题是如果直接修改会导致很多数据变成0,影响了原来到底哪些数据是0,所以需要先把是0的位置记录下来,所以最简单的是使用行列两个数组,记录哪些应该设置为0,之后再把这些设置为0。
看答案前我的解法
var setZeroes = function(matrix) {
const row = matrix.length;
const col = matrix[0].length;
const rowZero = [];
const colZero = [];
for (let i = 0; i < row; i++) {
for (let j = 0; j < col; j++) {
if (matrix[i][j] === 0) {
rowZero.push(i);
colZero.push(j);
}
}
}
for (let i = 0; i < row; i++) {
if (rowZero.includes(i)) {
for (let p = 0; p < col; p++) {
matrix[i][p] = 0;
}
}
}
for (let j = 0; j < col; j++) {
if (colZero.includes(j)) {
for (let p = 0; p < row; p++) {
matrix[p][j] = 0;
}
}
}
return matrix;
};
看了答案后,发现有2个地方要优化。
- 这个记录可以直接采用对应位置的数组置0,而不是一个个放进去。判断会快一些。
- 设置0的过程,直接一遍,然后判断当前行列是否应该清0,从而直接清0。
优化后:
var setZeroes = function(matrix) {
const row = matrix.length;
const col = matrix[0].length;
const zeroRow = [];
const zeroCol = [];
for (let i = 0; i < row; i++) {
for (let j = 0; j < col; j++) {
if (matrix[i][j] === 0) {
zeroRow[i] = true;
zeroCol[j] = true;
}
}
}
for (let i = 0; i < row; i++) {
for (let j = 0; j < col; j++) {
if (zeroRow[i] || zeroCol[j]) {
matrix[i][j] = 0;
}
}
}
return matrix;
}