Leetcode 73. Set Matrix Zeroes [medium][java]

Given a m x n matrix, if an element is 0, set its entire row and column to 0. Do it in-place.

Example
在这里插入图片描述

Solution 1: brute force
Consideration

  1. Use a boolean matrix to mark if the element has been set to 0.
  2. We iterate through the matrix. if the element is 0, we iterate the row and column. If the number in this row/column is not 0 and has not been set, we set it as 0 and mark it.

Time complexity:O(mnm) or O(mnn) depending on whether m or n is bigger, space complexity: O(m*n).

class Solution {
    public void setZeroes(int[][] matrix) {
        int rows = matrix.length;
        int cols = matrix[0].length;
        boolean[][] sets = new boolean[rows][cols];
        
        for(int i = 0; i < rows; i++)
            for(int j = 0; j < cols; j++) {
                if(sets[i][j])
                    continue;
                if(matrix[i][j] == 0) {
                    for(int k = 0; k < rows; k++) {
                        if(k != i && matrix[k][j] != 0 && !sets[k][j]) {
                            matrix[k][j] = 0;
                            sets[k][j] = true;
                        }
                    }
                    for(int k = 0; k < cols; k++) {
                        if(k != j && matrix[i][k] != 0 && !sets[i][k]) {
                            matrix[i][k] = 0;
                            sets[i][k] = true;
                        }
                    }
                }
            }
        
    }
}

Solution 2: Additional Memory Approach

  1. Iterate through the matrix. If the number is 0, we add its row index and column index to the rows set and cols set.
  2. We iterate through the rows set and cols set separately to set whole row/column to be 0.

Time Complexity: O(3mn), space complexity: O(m+n)

class Solution {
    public void setZeroes(int[][] matrix) {
        int rows = matrix.length;
        int cols = matrix[0].length;
        Set<Integer> rowSets = new HashSet();
        Set<Integer> colSets = new HashSet();
        
        for(int i = 0; i < rows; i++)
            for(int j = 0; j < cols; j++) {
                if(matrix[i][j] == 0) {
                    rowSets.add(i);
                    colSets.add(j);
                }
            }
        Iterator<Integer> ite = rowSets.iterator();
        while(ite.hasNext()) {
            int index = ite.next();
            for(int i = 0; i < cols; i++) {
                matrix[index][i] = 0;
            }
        }
        
        ite = colSets.iterator();
        while(ite.hasNext()) {
            int index = ite.next();
            for(int i = 0; i < rows; i++) {
                matrix[i][index] = 0;
            }
        } 
        
    }
}

Solution 3
Consideration

  1. We can use the first row and first column of the matrix as a flag. This flag would determine whether a row or column should beset to zero.
  2. The first cell of row and column for the first row and first column is the same i.e. matrix[0][0]. So we use matrix[0][0] to represent the first row flag and create a flag to represent the first column flag.
  3. We iterate through the whole matrix to mark the flags.
  4. Then, we start from the second row and second column to the end. If the row flag or column flag is set, change the element to be 0.
  5. We then check if matrix[0][0] == 0. If yes, we set the first row elements.
  6. Finally, we check the first column flag. If yes, we set the first column elements.

Time complexity: O(m*n), space complexity: O(1)

class Solution {
    public void setZeroes(int[][] matrix) {
        int rows = matrix.length;
        int cols = matrix[0].length;
        Boolean setFirstCol = false;
        
    
        // use the first row and first column as a flag to indidate if the row/column should be set as 0
        for(int i = 0; i < rows; i++) {
            //check first column
            if(matrix[i][0] == 0)
                setFirstCol = true;
            
            for(int j = 1; j < cols; j++) {
                if(matrix[i][j] == 0) {
                    matrix[i][0] = 0;
                    matrix[0][j] = 0;
                }
            }
        }
            
        //iterate over the matrix again, if the row/column should be set, set the element to 0    
        for(int i = 1; i < rows; i++)
            for(int j = 1; j < cols; j++) {
                if(matrix[i][0] == 0 || matrix[0][j] == 0)
                    matrix[i][j] = 0;
            }

        //check if the first row should be set as 0
        if(matrix[0][0] == 0) {
            for(int j = 1; j < cols; j++)
                matrix[0][j] = 0;
        }
        
        //check if the first column should be set as 0
        if(setFirstCol) {
            for(int i = 0; i < rows; i++) 
                matrix[i][0] = 0;
        }
        
    }
}

Reference

  1. https://leetcode.com/problems/set-matrix-zeroes/solution/
【资源介绍】 1、该资源包括项目的全部源码,下载可以直接使用! 2、本项目适合作为计算机、数学、电子信息等专业的课程设计、期末大作业和毕设项目,也可以作为小白实战演练和初期项目立项演示的重要参考借鉴资料。 3、本资源作为“学习资料”如果需要实现其他功能,需要能看懂代码,并且热爱钻研和多多调试实践。 图像数据处理工具+数据(帮助用户快速划分数据集并增强图像数据集。通过自动化数据处理流程,简化了深度学习项目的数据准备工作).zip 图像数据处理工具+数据(帮助用户快速划分数据集并增强图像数据集。通过自动化数据处理流程,简化了深度学习项目的数据准备工作).zip 图像数据处理工具+数据(帮助用户快速划分数据集并增强图像数据集。通过自动化数据处理流程,简化了深度学习项目的数据准备工作).zip 图像数据处理工具+数据(帮助用户快速划分数据集并增强图像数据集。通过自动化数据处理流程,简化了深度学习项目的数据准备工作).zip 图像数据处理工具+数据(帮助用户快速划分数据集并增强图像数据集。通过自动化数据处理流程,简化了深度学习项目的数据准备工作).zip 图像数据处理工具+数据(帮助用户快速划分数据集并增强图像数据集。通过自动化数据处理流程,简化了深度学习项目的数据准备工作).zip 图像数据处理工具+数据(帮助用户快速划分数据集并增强图像数据集。通过自动化数据处理流程,简化了深度学习项目的数据准备工作).zip 图像数据处理工具+数据(帮助用户快速划分数据集并增强图像数据集。通过自动化数据处理流程,简化了深度学习项目的数据准备工作).zip
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值