leetcode 73. Set Matrix Zeroes

题目
这道题的本质就是要用个额外空间来标记每一行和每一列是否存在0,如果存在的话,那么这一行或者这一列都要变为0。
方法一:
用两个数组分别代表每一行和每一列

class Solution {
    public void setZeroes(int[][] matrix) {
        int row = matrix.length;
        int col = matrix[0].length;
        boolean[] flagRow = new boolean[row];
        boolean[] flagCol = new boolean[col];
        for(int i=0;i<row;i++){
            for(int j=0;j<col;j++){
                if(matrix[i][j]==0){
                    flagRow[i] = true;
                    flagCol[j] = true;
                }
            }
        }
        for(int i=0;i<row;i++){
            if(flagRow[i]){
                for(int j=0;j<col;j++){
                    matrix[i][j] = 0;
                }
            }
        }
        for(int j=0;j<col;j++){
            if(flagCol[j]){
                for(int i=0;i<row;i++){
                    matrix[i][j] = 0;
                }
            }
        }
    }
}

方法二:
要求要用O(1)的额外空间,其实就是在数组的本身上操作。问题的关键点就在于如果每一行都存在0,那么整个数组就都会变为0.如果存在一行其中不包含0.那么就可以用这一行来进行标记。因为这一行最终并不会全部变为0.所以这一行的每一个位置记录的是这个位置对应的这一列是否存在0.

class Solution {
    public void setZeroes(int[][] matrix) {
        int nonZero = -1;
        int row = matrix.length,col = matrix[0].length;
        for(int i=0;i<row;i++){
            int j = 0;
            for(j=0;j<col;j++){
                if(matrix[i][j]==0){
                    break;
                }
            }
            if(j==col){
                nonZero = i;
                break;
            } 
        }
        if(nonZero==-1){
            for(int i=0;i<row;i++){
                for(int j=0;j<col;j++){
                    matrix[i][j] = 0;
                }
            }
        }else{
            for(int i=0;i<row;i++){
                for(int j=0;j<col;j++){
                    if(matrix[i][j]==0){
                        matrix[nonZero][j] = 0;
                    }
                }
            }
            for(int i=0;i<row;i++){
                for(int j=0;j<col;j++){
                    if(i==nonZero) continue;
                    if(matrix[i][j]==0){
                        for(int j2=0;j2<col;j2++){
                            matrix[i][j2] = 0;
                        }
                    }
                }
            }
            for(int j=0;j<col;j++){
                if(matrix[nonZero][j]==0){
                    for(int i=0;i<row;i++){
                        matrix[i][j] = 0;
                    }
                }
            }
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值