力扣——矩阵置零

题目链接:

链接

题目描述:

在这里插入图片描述

思路:

只需要两个元素分别记录行和列就行
第一次遍历,找到为0的元素,标注行和列是true
第一次遍历,如果行或列是true,把这行元素该为0

上面是用了两个额外的数组做标记,实际上可以用矩阵本身的行和列做标记,就用第一行和第一列
注意:第一列的0表示某一行有0
第一行的0表示某一列有0
在这里插入图片描述

然后再次遍历,如果某个元素所在位置的首行或首列为0,就把这个元素变为0,这里不能遍历到首列,但是可以遍历到首行,因为首行元素是否变0,要看首列元素里面第一个元素,
在这里插入图片描述

这里需要注意,因为首行首列做过修改,所以我们再次遍历的时候要从后往前遍历,避免前面修改得到的0干扰
在这里插入图片描述

而且,由于首列的元素被修改成0,还需要看原始首列是否有0,有0的话做个标记,在遍历的时候把首列元素设为0

实现代码:

class Solution {
    public void setZeroes(int[][] matrix) {
        int row = matrix.length;
        int col = matrix[0].length;
        boolean[] a = new boolean[row];
        boolean[] b = new boolean[col];

        for(int i = 0 ; i < row; i++){
            for(int j = 0; j < col; j++){
                if(matrix[i][j] == 0){
                    a[i] = b[j] = true;
                }
            }
        }
        for(int i = 0 ; i < row; i++){
            for(int j = 0; j < col; j++){
                if(a[i] || b[j]){
                    matrix[i][j] = 0;
                }
            }
        }
    }
}
class Solution {
    public void setZeroes(int[][] matrix) {
        int row = matrix.length;
        int col = matrix[0].length;
        boolean flagcol0 = false;
        for(int i = 0 ; i < row; i++){
            if(matrix[i][0]==0){
                flagcol0 = true;
            }
            for(int j = 1; j < col; j++){
                if(matrix[i][j] == 0){
                    matrix[i][0] = matrix[0][j] = 0;
                }
            }
        }
        for(int i = row - 1 ; i >= 0; i--){
            for(int j = col - 1; j >= 1; j--){
                if(matrix[i][0] == 0 || matrix[0][j] == 0){
                    matrix[i][j] = 0;
                }
            }
            //看原始首列是否存在0,存在就变0
            if(flagcol0) matrix[i][0] = 0;
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值