看起来很容易,但是按照正常的思路来解却有很多坑, 如果一个值==0, 那么它所在的那行和列全部设为0, 好像表面看起来直接根据这个逻辑写个for循环就AC了, 但是实际上要考虑一个问题就是会出现递归的情况, 就是设为0以后 这些变成0的值又执行了上述的这个逻辑,这就比较麻烦了。 但是 实际上出现这种情况的原因自己跑一遍逻辑就会发现是[i][0] [0][j]这些元素搞的鬼。 所以做赋值操作的时候从索引1开始。
class Solution {
public void setZeroes(int[][] matrix) {
boolean zeroCol = false;
boolean zeroRow = false;
// 如果第一列有值为0 , 那么第一列全部要设成0, 但不是现在设, 否则会影响下面的 for循环判定
for(int i = 0; i < matrix.length; i++) {
if(matrix[i][0] == 0) {
zeroCol = true;
break;
}
}
// 同理
for(int j = 0; j < matrix[0].length; j++) {
if(matrix[0][j] == 0) {
zeroRow = true;
break;
}
}
// 现在这个[i][0] [0][j]为0的原因避免了 第一列和第一行有值为0的干扰。
for(int i = 1; i < matrix.length; i++) {
for(int j = 1; j < matrix[0].length; j++) {
if(matrix[i][j] == 0) {
matrix[i][0] = 0;
matrix[0][j] = 0;
}
}
}
// 避免了干扰之后 这个时候[i][0] [0][j] = 0的情况就可以放心大胆的给[i][j]赋0了
for(int i = 1; i < matrix.length; i++) {
for(int j = 1; j < matrix[0].length; j++) {
if(matrix[i][0] == 0 || matrix[0][j] == 0) {
matrix[i][j] = 0;
}
}
}
if(zeroRow == true) {
for(int j = 0; j < matrix[0].length; j++) {
matrix[0][j] = 0;
}
}
if(zeroCol == true) {
for(int i = 0; i < matrix.length; i++) {
matrix[i][0] = 0;
}
}
}
}