编写一种算法,若M × N矩阵中某个元素为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]
]
题意就是遇到0,行和列皆为0,如果直接在原数列上操作可能会把同行同列的0给遗漏掉,所以就直接上了最笨的方法暴力法,创一个相同大小的数组,记录0的位置,然后在进行置0的操作
代码如下:
class Solution {
public void setZeroes(int[][] matrix) {
int[][] flat = new int [matrix.length-1][matrix[0].length-1];
for(int i = 0;i < matrix.length - 1;i++){
for(int j = 0;j < matrix[0].length -1;j++){
if(matrix[i][j] == 0){flat[i][j] = 1;}
}
}
for(int i = 0;i < matrix.length - 1;i++){
for(int j = 0;j < matrix[0].length -1;j++){
if(flat[i][j] == 1){
for(int x = 0;x < matrix.length - 1;x++){
matrix[i][x] = 0;
}
for(int y = 0;y < matrix[0].length -1;y++){
matrix[y][j] = 0;
}
}
}
}
}
}
我以为这代码挺蠢的结果执行时间和内存消耗还挺少的,我去看了看别人的代码看到一个不使用额外数组的,还挺好的,用第一行和第一列就记录0的位置,先遍历第一行第一列有0记录在遍历剩下的,如[5][6],则[5][0]和[0][6]置为0,遍历完成后,遍历从i=1,j=1开始的数组,第一行中的0则一列皆为0,第一列中的0则一行皆为0,最后在把第一行第一列处理一下就敲完了。
这是那位的思路,但是我觉得记录0的方法挺好的,但是在处理0的时候可以直接遍历第一行和第一列就好了。
以下是我找来的代码:
class Solution {
public void setZeroes(int[][] matrix) {
boolean isFirstRowHaveZero = false;
boolean isFirstColHaveZero = false;
for(int i = 0; i < matrix.length; i++) {
if (matrix[i][0] == 0) {
isFirstColHaveZero = true;
}
}
for(int j = 0; j < matrix[0].length; j++) {
if (matrix[0][j] == 0) {
isFirstRowHaveZero = true;
}
}
for(int i = 1; i < matrix.length; i++) {
for(int j = 1; j < matrix[i].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[i].length; j++) {
if (matrix[0][j] == 0 || matrix[i][0] == 0) {
matrix[i][j] = 0;
}
}
}
for(int i = 0; i < matrix.length; i++) {
if (isFirstColHaveZero) {
matrix[i][0] = 0;
}
}
for(int j = 0; j < matrix[0].length; j++) {
if (isFirstRowHaveZero) {
matrix[0][j] = 0;
}
}
}
}
以下是我修改过的代码:
class Solution {
public void setZeroes(int[][] matrix) {
boolean isFirstRowHaveZero = false;
boolean isFirstColHaveZero = false;
for(int i = 0; i < matrix.length; i++) {
if (matrix[i][0] == 0) {
isFirstColHaveZero = true;break;
}
}
for(int j = 0; j < matrix[0].length; j++) {
if (matrix[0][j] == 0) {
isFirstRowHaveZero = true;break;
}
}
for(int i = 1; i < matrix.length; i++) {
for(int j = 1; j < matrix[i].length; j++) {
if (matrix[i][j] == 0) {
matrix[0][j] = 0;
matrix[i][0] = 0;
}
}
}
for(int i = 1; i < matrix.length; i++)
if(matrix[i][0] == 0)
for(int j = 1;j < matrix[0].length;j++) matrix[i][j] = 0;
for(int j = 1; j < matrix[0].length; j++)
if(matrix[0][j] == 0)
for(int i = 1;i < matrix.length;i++) matrix[i][j] = 0;
if (isFirstColHaveZero)
for(int i = 0; i < matrix.length; i++) matrix[i][0] = 0;
if (isFirstRowHaveZero)
for(int j = 0; j < matrix[0].length; j++) matrix[0][j] = 0;
}
}
以为我是对着那个人的代码修改的所以代码还是很相似的