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/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值